批量重命名文件夹中的文件的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您需要的参数