it-swarm.cn

如何更改多个文件的扩展名?

我想将文件扩展名从*.txt更改为*.text。我尝试使用basename命令,但是在更改多个文件时遇到问题。

这是我的代码:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

我收到此错误:

basename: too many arguments Try basename --help' for more information
192
afbr1201

直接来自 Greg的Wiki

#将* .txt中的所有f.txt重命名为* .text 
;做
 mv-“ $ f”“ $ {f%.txt} .text” 
完成

另请参阅有关为什么 不应解析ls 的条目。

编辑:如果必须使用basename,则语法为:

代表* .txt中的f; do 
 mv-“ $ f”“ $(basename-” $ f“ .txt).text” 
完成
211
jasonwryan

这是我更改Debian当前目录中所有文件扩展名的方法。

rename "s/oldExtension/newExtension/" *.txt

(这是Perl rename命令,而不是util-linux一。请参阅 为什么Debian/Ubuntu上的重命名实用程序与其他发行版(例如CentOS)上的重命名实用程序不同?

157
Matthias Braun

一个简单的命令,是util-linux ,将为您完成此操作,它将在所有匹配“ * .txt”的文件中将“ txt”的所有出现替换为“ text”:

rename txt text *.txt
43
lamwaiman1988
rename "s/oldExtension/newExtension/" *.txt

以上工作正常,但仅限于当前目录。请尝试以下命令,该命令对于子目录很灵活。它将重命名所有.txt文件在目录结构下,带有新扩展名。

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
31
Rahul

这里的答案参考s/oldExtension/newExtension/ 错了。如果您使用s/txt/text/,您将转换footxt.txtfootext.txt,这不是您想要的。即使您使用s/.txt/.text/,可以转换footxt.txtfo.text.txt

您必须使用\.以匹配时间段(.将匹配任何字符)。和尾随的$以匹配行尾。只有这样才能正确匹配扩展名。

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
12
wisbucky
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
9
Prince John Wesley

基于@Prince John Wesley的答案,这是一个简单的bash脚本,用于将当前目录中文件的所有扩展名从ext1ext2。还输出要重命名的文件的名称。

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

用法示例(假设脚本名称为change-ext):

change-ext ext1 ext2
8
Dennis Golomazov

原因#53切换到zsh:

zmv '(*).txt' '$1.text'

7
Burrito

假设您的文件分散在各个目录中,假设dirx是您的父目录,则可以使用find执行此操作:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
6
Arash

这对我有效:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
2
yegor256

当你

没有源文件的扩展名

而目标扩展名是。text,您可以这样做-

for f in *; do mv -- "$f" "${f%.\*}.text"; done
2
nitinr708

如果您想知道版本中出了什么问题:您使用$files 代替 $x在basename命令中。因此,这应该起作用(不过,未经测试):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
1
daniel kullmann