Shell / Bash中是否有一个快捷方式可以根据正则表达式或其他一些条件重命名文件夹中的所有文件。我在这里寻找的是在我的文件夹文件中,让我们说出100个文本文件,其中包含以下命名约定:
<longdocumentidentifier>-doc-<counter>.txt.
我需要将具有上述约定的所有文件重命名为:
doc-<counter>.txt
是否有一个可以帮我解决上述问题的单行程序?
答案 0 :(得分:92)
我会建议这样的事情:
for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done
${i/*-doc-/doc-}
将*-doc-
的第一次出现替换为doc-
。
如果您需要进行多次替换(请参阅注释编号1),则需要使用${var//Pattern/Replacement}
变体。如果您需要替换名称的开头,则需要使用${var/#Pattern/Replacement}
,如果您需要替换结尾(即:扩展名),则需要使用${var/%Pattern/Replacement}
表单。
有关详细信息,请参阅http://tldp.org/LDP/abs/html/parameter-substitution.html#EXPREPL1
答案 1 :(得分:21)
如果您有rename
,那么rename 's/^.*-doc-/doc-/' *.txt
就可以了。
答案 2 :(得分:12)
有prename
,允许您使用REGEX:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
使用选项-n
来模拟:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
注意:这是许多Linux发行版中的rename
,但不是全部 - 所以我使用规范名称来实现与Perl。
答案 3 :(得分:8)
大多数linux内置的重命名命令,例如,可以轻松完成。
就个人而言,我也更喜欢正则表达式,这就是为什么我在很长一段时间里一直带着这个剧本的原因(阅读:自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
答案 4 :(得分:5)
如果要递归到子目录,还有:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
在自动支持扩展正则表达式的系统上,您可以放弃-E
。
优点:
缺点:
(从here修改的答案)
答案 5 :(得分:4)
mmv "*-doc-*" "doc-#2"
mmv命令代表“群众移动”
答案 6 :(得分:3)
如果你不介意外部工具,那么这里有一个:rnm(web page)
对于您的特定问题,命令将是:
rnm -rs '/.*-doc-/doc-/' *.txt
或者
rnm -rs '/.*-(doc-.*\.txt)/\1/' *.txt
您可以找到更多示例/文档here。
答案 7 :(得分:0)
找到。 -name&#39; * scss&#39; | xargs -L1 -I {} echo {} {} | sed&#39; s / css.scss $ / scss /&#39; | xargs -L1 mv
例如,如果你有一堆以&#34; .css.scss&#34;结尾的文件;并且你想要将它们重命名为简单的&#34; .scss&#34; (即删除.css部分)
调整正则表达式并找到符合您需求的参数