sc_*_*ray 54 linux bash scripting file-io
Shell/Bash中是否有一个快捷方式可以根据正则表达式或其他一些条件重命名文件夹中的所有文件.我在这里寻找的是在我的文件夹文件中,让我们说100个文本文件具有以下命名约定:
<longdocumentidentifier>-doc-<counter>.txt.
Run Code Online (Sandbox Code Playgroud)
我需要使用上面给出的约定将所有文件重命名为:
doc-<counter>.txt
Run Code Online (Sandbox Code Playgroud)
是否有一个可以帮助我完成上述工作的单行程?
Sor*_*rin 101
我会建议这样的事情:
for i in *-doc-*.txt; do mv $i ${i/*-doc-/doc-}; done
Run Code Online (Sandbox Code Playgroud)
${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
Eli*_*les 12
有prename
,允许您使用REGEX:
prename 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Run Code Online (Sandbox Code Playgroud)
使用该选项-n
模拟:
prename -n 's/^.*-doc-(.*\.txt)$/doc-$1/' *.txt
Run Code Online (Sandbox Code Playgroud)
注意:这是rename
许多Linux发行版中提供的,但不是全部 - 所以我使用Perl附带的实用程序的规范名称.
例如,内置于大多数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,$_);
}
}
Run Code Online (Sandbox Code Playgroud)
哪个,安装后可以让你做这样的事情:
script-name 's/.*-doc(.*).txt/doc$1.txt/' *.txt
Run Code Online (Sandbox Code Playgroud)
如果要递归到子目录,还有:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
Run Code Online (Sandbox Code Playgroud)
在自动支持扩展Regexp的系统上,您可以放弃-E
.
好处:
缺点:
(答案从这里修改)