Я использую Snow Leopard, и мои снимки экрана сохраняются как Screen shot ...
(обратите внимание на строчные буквы s
на shot
). Лев теперь использует прописные буквы S
? Если это так, и ваш оригинальный скрипт использовал строчную букву s
, то это, вероятно, и сломало его. В любом случае, давайте это исправим.
Ваша замена
$new =~ s!^SS (.*) at (.*)\.png!ss-$1\_$2.png!;
ищет имена файлов, начинающиеся с SS
, за которыми следует пробел, но звучит так, как будто вы хотите изменить имена файлов, начиная с SS
, за которыми следуют -
, или Screen [Ss]hot
с последующим пробелом.
Кроме того, как указал @FailedDev, ваш цикл while
добавляет только файлы, которые соответствуют ^Screen Shot (.*) at (.*)\.png
, в ваш массив @files
, поэтому вы foreach
цикл никогда не увидите файлы, начинающиеся с SS
.
Замените ваш код следующим:
#!/usr/bin/perl -w
use strict; # ALWAYS!
chdir( "/Users/me/Desktop" ) or die("Could not chdir() to ~/Desktop: $!");
foreach my $f (<*>) {
my $new = $f;
if ($new =~ s!^(?:SS-|Screen [Ss]hot )([\d-]+) at ([\d\.]+) ([AP]M)\.png!ss-$1.at.$2.$3.png!) {
$new =~ s/\-/\./g;
print "$f -> $new\n";
rename ( $f, $new ) or die("Could not rename $f to $new: $!");
}
}
Чтобы помочь вам понять, что происходит:
-
^
после s!
означает, что нужно смотреть только начало текста для замены, в данном случае имя файла
-
|
между SS-
и Screen [Ss]hot
[сгруппированы по (?:)
] означает, что нужно искать SS-
или Screen [Ss]hot
.
- Три группы захвата [окруженные
()
без ?:
] не содержат пробелов, поэтому $1
, $2
и $3
в вашей замене не будут содержать пробелов .
- Оператор
if
гарантирует, что код внутри блока if
выполняется только в том случае, если имя файла совпадает, и подстановка действительно происходит.