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

将ACDCreplace为AC-DC

例如,我们有这些文件

ACDC – 摇滚乐不是噪音Pollution.xxx

ACDC – Rocker.xxx

ACDC – 拍摄到Thrill.xxx

我希望他们成为:

交stream – 直stream – 摇滚不是噪音污染.xxx

AC-DC – Rocker.xxx

AC-DC – 拍摄到Thrill.xxx

我知道sed或awk用于这个操作。 我不能谷歌任何东西,所以我要求你的帮助=)你能提供完整的工作shell命令这个任务?

反馈: OSX用户的解决scheme

 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/AZ/az/' * 

这个答案包含了所有其他答案中的好的部分,而忽略了ls | while read这样的异端 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 

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

 rename ACDC AC-DC ACDC* 

要么

 rename.ul ACDC AC-DC ACDC* 

使用bash shell

 find . -type f -name "ACDC*" -print0 | while read -d $'\0' f do new=`echo "$f" | sed -e "s/ACDC/AC-DC/"` mv "$f" "$new" done 

注意:使用find会处理当前目录下的目录。

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

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

可能不是最好的解决scheme,但工作。

使用bash:

 ls *.xxx | while read fn; do mv "${fn}" "${fn/ACDC/AC-DC}"; done 

如果您安装了rename程序:

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