批量重命名文件夹中的文件的Shell / Bash快捷方式

Shell / Bash中是否有一个快捷方式可以根据正则expression式或其他条件重命名文件夹中的所有文件。 我在这里找的是在我的文件夹文件中,我们可以说有100个文本文件,具有以下命名约定:

<longdocumentidentifier>-doc-<counter>.txt. 

我需要重新命名上述给定的所有文件只是:

 doc-<counter>.txt 

是否有一个可以帮助我与上述?

我会build议这样的事情:

 for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done 

${i/*-doc-/doc-}replace了第一个出现的*-doc-*-doc-

如果您需要执行多个replace(请参阅注释编号1),则需要使用${var//Pattern/Replacement}变体。 如果您需要replace名称的开头,您需要使用${var/#Pattern/Replacement} ,如果您需要replace结尾(即:扩展名),则需要使用${var/%Pattern/Replacement}表单。

有关详细信息,请参阅http://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1

如果你已经rename那么rename 's/^.*-doc-/doc-/' *.txt就可以了。

有一个prename ,允许你使用REGEX:

 prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt 

使用选项-n来模拟:

 prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt 

注意:这是许多Linux发行版中的rename ,但不是所有这些发行版 – 所以我使用Perl自带的实用程序的规范名称。

内置在大多数Linux中的重命名命令,例如,将很容易地做到这一点。

就我个人而言,我也更喜欢regexps,这就是为什么我在很长一段时间里一直带着这个剧本(自80年代末或90年代初以来):

 #!/usr/bin/perl ($op = shift) || die "Usage: $0 expr [files]]\n"; if(!@ARGV) { @ARGV = <STDIN>; chop(@ARGV); } for (@ARGV) { $was = $_; eval $op; die $@ if $@; if ($was ne $_) { print "rename($was,$_)\n"; rename($was,$_); } } 

当安装时,可以让你做这样的事情:

 script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt 

如果你想recursion到子目录,还有:

 find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv 

在自动支持扩展正则expression式的系统上,您可以放弃-E

优点:

  • recursion到子目录中
  • 你可以控制recursion的最大深度
  • 您可以重命名文件和/或目录(-type f | d)

缺点:

  • 稍微复杂的正则expression式,因为你必须去掉文件名的path

(从这里修改的答案)

 mmv "*-doc-*" "doc-#2" 

mmv命令代表“批量移动”

如果你不介意外部工具,那么这里是一个: rnm ( 网页 )

对于你的特定问题,命令是:

 rnm -rs '/.*-doc-/doc-/' *.txt 

要么

 rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt 

你可以在这里find更多的例子/文档。

找 。 -name'* scss'| xargs -L1 -I {} echo {} {} | sed's / css.scss $ / scss /'| xargs -L1 mv

例如,如果你有一堆以“.css.scss”结尾的文件,而你想重命名为“.scss”(即删除.css部分)

调整正则expression式,并find您需要的参数