在Unix中重命名多个文件

227 unix rename file batch-rename

目录中有多个以prefix开头的文件fgh,例如:

fghfilea
fghfileb
fghfilec
Run Code Online (Sandbox Code Playgroud)

我想重命名所有这些以前缀开头jkl.是否有单个命令来执行此操作而不是单独重命名每个文件?

Ste*_*202 272

有几种方法,但使用rename可能是最简单的方法.

使用以下版本rename:

rename 's/^fgh/jkl/' fgh*
Run Code Online (Sandbox Code Playgroud)

使用另一个版本rename(与Judy2K的答案相同):

rename fgh jkl fgh*
Run Code Online (Sandbox Code Playgroud)

您应该检查平台的手册页以查看上述哪个适用.

  • OS X上的'brew install rename` :) (28认同)
  • +1甚至不知道重命名...现在我可以停止使用mv和sed的for循环...谢谢! (7认同)
  • 并非所有*nix系统都存在.不是在Max OS X上,而在fink中没有包来获得它.没看过MacPorts. (7认同)
  • AFAICT,`rename`似乎是Linux特定的脚本或实用程序.如果您关心可移植性,请继续使用`sed`和循环或内联Perl脚本. (5认同)
  • 你链接到一个不同的`rename`然后你显示http://unixhelp.ed.ac.uk/CGI/man-cgi?rename的语法是另一个 (2认同)
  • 我之前从未见过这个.绝对不标准.它也在RHEL5上,但*不是*Solaris 10. (2认同)

nik*_*nik 107

这是如何sed以及mv可以一起使用来重命名:

for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done
Run Code Online (Sandbox Code Playgroud)

按下面的评论,如果文件名有空格的,报价可能需要围绕子的函数,返回名称的文件移动到:

for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
Run Code Online (Sandbox Code Playgroud)

  • 如果您无法"重命名",则可以使用.如果您的文件名包含空格,则代码可能需要引号.`for f in fgh*; 做mv"$ f""$(echo $ f | sed's/^ fgh/jkl/g')"; done` (5认同)
  • 很接近。请注意,您只想匹配第一次出现的 fgh:'s/^fgh/jkl/g'(插入符号决定一切)。 (2认同)
  • 只是为了精确...你的意思是"在名字的开头",而不是"第一次出现fgh"./ ^ fgh /将匹配"fghi",但不匹配"efgh". (2认同)

gho*_*g74 73

重命名可能不在每个系统中.所以如果你没有它,请在bash shell中使用shell这个例子

for f in fgh*; do mv "$f" "${f/fgh/xxx}";done
Run Code Online (Sandbox Code Playgroud)

  • 在此解决方案中,不需要“sed”命令。这比 @nik 的答案更简单。 (3认同)
  • xxx代表替换?如果是原始海报,那就是“jkl” (2认同)
  • 最干净的解决方案。 (2认同)
  • 也许更强调指出,这是Bash扩展,在POSIX`sh`或其他Shell中通常不存在。 (2认同)

Lee*_*ton 37

使用mmv:

mmv "fgh*" "jkl#1"
Run Code Online (Sandbox Code Playgroud)

  • 如果要以递归方式批量重命名,请将`;`与`#1`结合使用.例如:`mmv"; fgh*""#1jkl#2"` (3认同)

iwe*_*ein 19

有很多方法可以做到(并非所有这些方法都适用于所有unixy系统):

  • ls | cut -c4- | xargs -I§ mv fgh§ jkl§

    §可能被您认为方便的任何东西取代.您也可以这样做,find -exec但在许多系统上表现略有不同,所以我通常会避免这种情况

  • for f in fgh*; do mv "$f" "${f/fgh/jkl}";done

    原油但他们说的有效

  • rename 's/^fgh/jkl/' fgh*

    真的很漂亮,但BSD上没有重命名,这是最常见的unix系统.

  • rename fgh jkl fgh*

  • ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';

    如果您坚持使用Perl,但系统上没有重命名,则可以使用此怪物.

其中一些有点复杂,列表远未完成,但你会在这里找到你想要的几乎所有unix系统.

  • 我喜欢这种怪物! (2认同)

Jud*_*y2K 13

rename fgh jkl fgh*
Run Code Online (Sandbox Code Playgroud)

  • 在我的机器上,这会产生错误'Bareword"fgh"不允许"严格的子"在(eval 1)第1行使用. (6认同)

lui*_*all 8

使用find,xargssed:

find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'
Run Code Online (Sandbox Code Playgroud)

它比@nik的解决方案更复杂,但它允许递归地重命名文件.例如,结构,

.
??? fghdir
?   ??? fdhfilea
?   ??? fghfilea
??? fghfile\ e
??? fghfilea
??? fghfileb
??? fghfilec
??? other
    ??? fghfile\ e
    ??? fghfilea
    ??? fghfileb
    ??? fghfilec
Run Code Online (Sandbox Code Playgroud)

会变成这个,

.
??? fghdir
?   ??? fdhfilea
?   ??? jklfilea
??? jklfile\ e
??? jklfilea
??? jklfileb
??? jklfilec
??? other
    ??? jklfile\ e
    ??? jklfilea
    ??? jklfileb
    ??? jklfilec
Run Code Online (Sandbox Code Playgroud)

使其工作的关键xargs从xargs调用shell.

  • 我本来想发布这样的东西,但我需要一个小时才能得到正确的命令 (2认同)

Zak*_*kaZ 6

通用命令是

find /path/to/files -name '<search>*' -exec bash -c 'mv $0 ${0/<search>/<replace>}' {} \;

其中<search><replace>应分别替换为您的源和目标。

作为针对您的问题量身定制的更具体的示例(应从文件所在的同一文件夹运行),上面的命令如下所示:

find . -name 'gfh*' -exec bash -c 'mv $0 ${0/gfh/jkl}' {} \;

对于“空运行”,添加echobefore mv,以便您可以看到生成了哪些命令:

find . -name 'gfh*' -exec bash -c 'echo mv $0 ${0/gfh/jkl}' {} \;


归档时间:

查看次数:

257774 次

最近记录:

6 年,1 月 前