Shell/Bash 中是否有快捷方式可以根据正则表达式或其他标准重命名文件夹中的所有文件。我在这里寻找的是我的文件夹文档,假设有 100 个具有以下命名约定的文本文件:
<longdocumentidentifier>-doc-<counter>.txt.
我需要将具有上述给定约定的所有文件重命名为:
doc-<counter>.txt
有没有一句话可以帮助我解决上述问题?
我会建议这样的事情:
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}
形式。
请参阅Shell 参数扩展了解更多详细信息。此扩展是特定于 bash 的。
如果您有
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 附带的实用程序的规范名称。
如果想递归到子目录,还有:
find . -maxdepth N -type f -name "$pattern" | sed -e 'p' -E -e "s/$str1/$str2/g" | xargs -n2 mv
在自动支持扩展正则表达式的系统上,您可以省略
-E
。
优点:
缺点:
(答案修改自此处)
例如,大多数 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
mmv "*-doc-*" "doc-#2"
mmv 命令代表“质量移动”
找到。 -名称 '*scss' | xargs -L1 -I {} 回显 {} {} | sed 's/css.scss$/scss/' | sed 's/css.scss$/scss/' | xargs -L1 mv
例如,如果您有一堆以“.css.scss”结尾的文件,并且您想将它们重命名为仅以“.scss”结尾(即删除 .css 部分)
调整正则表达式并找到满足您需求的参数
也许cada也可以提供帮助:
cada 'mv *-doc-*.txt {}' 're.findall("doc-\d+\.txt$", s)[0]'