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

hol*_*lms 39 files shell rename sed

将 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 用于此操作。我无法用谷歌搜索任何东西,所以我在寻求你的帮助 =) 你能为此任务提供完整的 shell 命令吗?

反馈:OSX 用户的解决方案

Joe*_*l K 51

rename 's/ACDC/AC-DC/' *.xxx
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

例如,要重命名与“*.bak”匹配的所有文件以去除扩展名,您可能会说

rename 's/\.bak$//' *.bak
Run Code Online (Sandbox Code Playgroud)

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

rename 'y/A-Z/a-z/' *
Run Code Online (Sandbox Code Playgroud)

  • 请注意,许多 linux 机器都带有来自 util-linux 的重命名,它实现了简单的替换,*不是*正则表达式。因此,如果重命名失败而没有做任何事情,则您可能使用了错误的“重命名”。 (6认同)

use*_*686 15

这个答案包含了所有其他答案的优点,同时省略了诸如ls | while read.

当前目录:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done
Run Code Online (Sandbox Code Playgroud)

包括子目录:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done
Run Code Online (Sandbox Code Playgroud)

换行符是真的不太可能的文件名,所以这可以更简单,同时还包含空格的名称的工作:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done
Run Code Online (Sandbox Code Playgroud)


Den*_*son 13

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

rename ACDC AC-DC ACDC*
Run Code Online (Sandbox Code Playgroud)

或者

rename.ul ACDC AC-DC ACDC*
Run Code Online (Sandbox Code Playgroud)

  • 你的变体是最好的 =) 谷歌中有很多关于查找和发送以及 awk 的愚蠢文章......这个简单的操作已经 renameutils egxist 了! (2认同)