我需要重命名所有的图像,因为标题解释在所有的子文件夹。我正在考虑用正则表达式提取括号内的数字,然后重命名它。环顾四周,我发现有像rename和mmv这样的工具,但我无法让它们重新命名jpgs。
我将感激任何建议来解决我的问题。
顺便说一句:是用于Windows的,我有cygwin和perl。
编辑:
结论对所有答案进行了实验。
rename不好,我可以工作的那个不接受regex,但是肯定是一个不错的选择,例如运行Linux和安装一个Win SharedFolder。rename使用这个shell脚本为Cygwin构建一个更好的sed工具。pwd而言,Windows的等效值只是cd。发布于 2010-12-30 10:04:33
下面的代码是在Linux上测试的;我不知道您可能需要修改什么才能使它在您的环境中工作。此外,我还没有对.jpg文件的子目录进行任何搜索;如果您希望我这样修改代码,请告诉我。
(编辑:为子目录范围内的搜索,请参阅程序版本进一步向下)
use strict;
use warnings;
sub pad_left {
my $num = shift;
if ($num < 10) {
$num = "00$num";
}
elsif ($num < 100) {
$num = "0$num";
}
return $num;
}
my @files = glob "*.jpg";
my @padded_names = map {
my $name = $_;
$name =~ s/^([\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
$name;
} @files;
foreach (0..$#files) {
rename($files[$_], $padded_names[$_]);
print "$files[$_] --> $padded_names[$_]\n";
}上面的程序重命名文件并打印以下内容:
file(1).jpg --> file(001).jpg
file(2).jpg --> file(002).jpg
file(20).jpg --> file(020).jpg
file(200).jpg --> file(200).jpgHTH
编辑:这里的是上述程序的一个改进版本--它现在还包含了搜索.jpg文件的子目录。我知道我的代码已经不需要了,因为现在已经给出了解决子目录问题的答案,但是.:)
use strict;
use warnings;
use File::Find;
sub pad_left {
my $num = shift;
if ($num < 10) {
$num = "00$num";
}
elsif ($num < 100) {
$num = "0$num";
}
return $num;
}
sub new_name {
if (/\.jpg$/) {
my $name = $File::Find::name;
my $new_name;
($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
rename($name, $new_name);
print "$name --> $new_name\n";
}
}
chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the
# image-containing sub-directories
find(\&new_name, $localdir);发布于 2010-12-30 10:16:56
rename命令可以这样做:
rename 's/\d+/sprintf("%03d",$&)/e' *.jpg与子目录:
find . -type f -name \*.jpg -print0|xargs -0 rename 's/\d+/sprintf("%03d",$&)/e'发布于 2010-12-30 15:53:11
perl -MFile::Find::Rule -E 'rename($_, s/ \( \K ([0-9]+) (?= \) ) / sprintf("%03s", $1) /rex) for File::Find::Rule->file->name("*.jpg")->in($ARGV[0])' directory_here但是,由于5.13+标志,这只适用于/r Perls。
编辑:对于Windows,你必须用双引号改变外部引号,或者转义sprintf和name中的引号,或者使用不同的分隔符ala!%03d!
EDIT2:哇,完全搞砸了我的定界符。
https://stackoverflow.com/questions/4561576
复制相似问题