如何通过替换文件名中的单词来重命名多个文件?

如何通过替换文件名中的单词来重命名多个文件?

将 ACDC 替换为 AC-DC

例如我们有这些文件

ACDC——摇滚乐不是噪音污染。xxx

ACDC-Rocker.xxx

ACDC – Shoot To Thrill.xxx

我希望他们成为:

AC-DC——摇滚乐不是噪音污染。xxx

AC-DC-Rocker.xxx

AC-DC – 射击惊险.xxx

我知道这个操作需要用到 sed 或 awk。我无法用 Google 搜索到任何内容,所以我请求您的帮助 =) 您能否提供用于此任务的完整工作 shell 命令?

反馈:OSX 用户的解决方案

答案1

rename 's/ACDC/AC-DC/' *.xxx

man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

例如,要重命名所有匹配“*.bak”的文件以删除扩展名,你可以说

rename 's/\.bak$//' *.bak

要将大写名称转换为小写,您可以使用

rename 'y/A-Z/a-z/' *

答案2

这个答案包含了其他所有答案中的好的部分,同时省略了诸如这样的异端邪说ls | while read

当前目录:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

包括子目录:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

换行符真的不太可能出现在文件名中,因此这可以更简单,同时仍然处理包含空格的名称:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

答案3

rename要使用Phil 提到的util-linux 版本(在 Ubuntu 上,它被称为rename.ul):

rename ACDC AC-DC ACDC*

或者

rename.ul ACDC AC-DC ACDC*

答案4

取决于你的 shell。在 zsh 中,我会这样做:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

可能不是最好的解决方案,但是有效。

相关内容