用一个命令重命名一组文件

Ric*_*ins 38 unix bash

如果我有一组扩展名为 .htm 的文件,我如何将它们全部重命名为 .html?

mv *.htm *.html
Run Code Online (Sandbox Code Playgroud)

不起作用。

小智 50

或者,您可以使用纯 bash ……(mv 除外,即……)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done
Run Code Online (Sandbox Code Playgroud)

并避免讨厌的基名内容。;)

Bash 有一组广泛的变量扩展选项。此处使用的“%”从变量值中删除最小匹配后缀。该模式是一个 glob 模式,所以${file%.*}也可以工作。'%%' 运算符删除最大的匹配后缀,并且在上面的示例中可以互换,因为模式是固定的,${file%%.*}.html但会将 abhtm 变成 a.html。

有关更巧妙的技巧,请参阅 bash 联机帮助页的变量替换部分。有很多可以直接在 bash 中完成的。


TRS*_*-80 11

rename(1)是一个 Perl 实用程序,可以完全满足您的需求。在这种情况下:

rename 's/\.htm$/.html/' *htm

或者如果您也使用子目录

(需要猛砸4.0和globstar设置:shopt -s globstar

rename 's/\.htm$/.html/' **/*htm

  • 是的,但并不是每个 unix 都在将 perl 放在系统上时包含辅助程序,例如“重命名”。例如,OSX 上没有“重命名”。 (3认同)
  • `rename` 带有 perl,现在基本上每个 unix 都带有 perl。 (2认同)

Den*_*son 11

文件名中不应该有空格、换行符或其他空格,但是这个版本的 freiheit 答案可以处理这些。它还使用$()而不是反引号来提高可读性以及其他好处。

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done
Run Code Online (Sandbox Code Playgroud)

更好 - 对于只是添加到最后的特殊情况:

for file in *.htm
do
    mv "$file" "${file}l"
done
Run Code Online (Sandbox Code Playgroud)


fre*_*eit 6

for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done
Run Code Online (Sandbox Code Playgroud)

第一次尝试echo在前面使用mv

原始文件的问题在于“ mv *.htm *.html*s 由外壳程序处理,因此该mv命令仅查看当前目录中所有 .htm 和 .html 文件的列表。换句话说,像“ mv foo.htm bar.htm stuff.htm six.htm file.htm”这样的东西。如果最后一个是目录,mv 只知道如何处理 2 个以上的参数。