приведенный ниже код был протестирован в 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).jpg
НТН
РЕДАКТИРОВАТЬ: Вот улучшенная версия вышеуказанной программы - теперь она также включает в себя поиск в подкаталогах для файлов .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);