我想将文件扩展名从 更改*.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
一个简单的命令,rename
从util-linux
,将为您做到这一点。它将所有匹配“*.txt”的文件中出现的所有“txt”替换为“text”:
rename txt text *.txt
答案4
这里引用的答案s/oldExtension/newExtension/
是错误的。如果您使用s/txt/text/
,您将转换footxt.txt
为footext.txt
,这不是您想要的。即使您使用s/.txt/.text/
,也会转换footxt.txt
为fo.text.txt
.
您必须使用\.
来匹配句点(.
将匹配任何字符)。尾部$
与行尾相匹配。只有这样才能正确匹配扩展名。
rename 's/\.txt$/.text/' *.txt
rename 's/\.old$/.new/' *.old