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

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

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

这是我的代码:

files=`ls -1 *.txt`

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

我收到此错误:

基本名称:参数过多尝试基本名称--help'以获取更多信息

答案1

直接来自格雷格的维基:

# Rename all *.txt to *.text
for file in *.txt; do
    mv -- "$file" "${file%.txt}.text"
done

*.txt通配模式,用作*通配符来匹配任何字符串。*.txt匹配所有以“.txt”结尾的文件名。

-- 标记选项列表的结尾。这可以避免以连字符开头的文件名问题。

${file%.txt}参数扩展,替换为从末尾删除的file变量值。.txt

另请参阅有关您的原因的条目不应该解析ls

如果您必须使用basename,您的语法将是:

for file in *.txt; do
    mv -- "$file" "$(basename -- "$file" .txt).text"
done

答案2

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

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

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

在 MacOS 上,用户僧侣皮特报告称他们能够利用brew install rename这一点来实现这一目标。

答案3

一个简单的命令,renameutil-linux,将为您做到这一点。它将所有匹配“*.txt”的文件中出现的所有“txt”替换为“text”:

rename txt text *.txt

答案4

这里引用的答案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

相关内容