如果我有一组扩展名为 .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
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)
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 个以上的参数。