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

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

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

mv *.htm *.html

不起作用。

答案1

或者,您可以使用纯 bash...(除了 mv,就是这样..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

并避免令人讨厌的基本名称内容。;)

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

请参阅 bash 手册页的变量替换部分,了解更多巧妙的技巧。在 bash 中可以直接完成很多操作。

答案2

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

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

甚至更好 - 对于只需添加到末尾的特殊情况:

for file in *.htm
do
    mv "$file" "${file}l"
done

答案3

rename(1)是一个 Perl 实用程序,可以完全满足您的要求。在本例中:

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

或者如果你也使用子目录

(需要 Bash 4.0 和 globstar 设置shopt -s globstar:)

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

答案4

另一个使用字符串替换的纯 bash 示例。

for file in *.htm; do mv $file ${file/htm/html}; done

额外 - 这将替换所有出现的字符串

for file in *.htm; do mv $file ${file//htm/html}; done

相关内容