试试这个,使用 shell 和 perl:
mkdir /tmp/test; cd $_
mkdir ABC DEF
touch {ABC,DEF}/{123,456}.jpg #creates four files, two in each directory
find|perl -nlE's,((.*)/(.+))/((123|456).jpg),$1/IT@{[++$n]}_$3_$4,&&say"$&\n$_\n"'
./ABC/123.jpg
./ABC/IT1_ABC_123.jpg
./ABC/456.jpg
./ABC/IT2_ABC_456.jpg
./DEF/123.jpg
./DEF/IT3_DEF_123.jpg
./DEF/456.jpg
./DEF/IT4_DEF_456.jpg
现在,在确认这是您想要的之后,将 say 替换为 rename:
find|perl -nlE's,((.*)/(.+))/((123|456).jpg),$1/IT@{[++$n]}_$3_$4, and rename$&,$_'
新文件名:
find -type f
./ABC/IT1_ABC_123.jpg
./ABC/IT2_ABC_456.jpg
./DEF/IT3_DEF_123.jpg
./DEF/IT4_DEF_456.jpg
这将找到具有 123.jpg 或 456.jpg 的文件名并重命名它们。
s,,, 是搜索替换,它返回 1(它所做的更改次数),这再次导致 and 的右侧正在完成(重命名)。
不匹配 123.jpg 或 456.jpg 的文件名不会被重命名,因为 s,,, 将返回 0 并且 and 是“快捷方式”,因为它在逻辑上不能为假 (0)左边。那么重命名就不被执行了。
这个变体的作用相同,但可能更容易阅读:
find|perl -nlE 'rename$&,$_ if s,((.*)/(.+))/((123|456).jpg),$1/IT@{[++$n]}_$3_$4,'
我发现这种模式在许多大规模重命名的情况下很有用。此外,还存在用于使用 GUI 进行大规模重命名的专用软件,这对某些人来说可能更易于使用。
改写成程序abc.pl,可以是:
#!/usr/bin/perl
while(<>){
chomp;
next if not s,((.*)/([A-Z]{3}))/(\d{3}\.jpg),$1/IT@{[++$n]}_$3_$4,;
print "Found: $&\nNew name: $_\n\n";
#rename $&, $_;
}
运行:
find|perl abc.pl