Можно ли написать скрипт для переименования серии файлов, как показано ниже:
sol-temp_0010.pngвsol-temp_1.pngsol-temp_0015.pngвsol-temp_2.pngsol-temp_0020.pngвsol-temp_3.png
так далее.?
Можно ли написать скрипт для переименования серии файлов, как показано ниже:
sol-temp_0010.png в sol-temp_1.pngsol-temp_0015.png в sol-temp_2.pngsol-temp_0020.png в sol-temp_3.pngтак далее.?
Команда rename включенная в Perl (и, следовательно, во многих дистрибутивах Linux), может сделать это достаточно легко:
rename 's%(\d+)%$1/5-1%e' sol-temp_*.png
Строка между одинарными кавычками оценивается как код Perl и используется для изменения каждого имени файла.
В частности, s%foo%bar% является оператором сравнения и замены регулярного выражения. (Обычно его пишут как s/foo/bar/ , но я хотел использовать косую черту в замене, поэтому я выбрал другой разделитель.) Регулярное выражение (\d+) соответствует первой последовательности из одной или нескольких цифр в имени файла и сохраняет его в переменной $1 для замены. Переключатель e в конце вызывает замену $1/5-1 как Perl-код, поэтому он возвращает число, хранящееся в $1 деленное на 10, минус один.
Если вам не удалось установить команду rename (или если ваше rename работает по-другому; есть несколько команд Unix, использующих это имя), но у вас есть Perl, вы можете получить почти такой же эффект, как этот:
perl -e 'for (<sol-temp_*.png>) {$o = $_; s%(\d+)%$1/5-1%e; rename $o, $_}'
Однако обратите внимание, что в этой версии нет проверки ошибок и защиты от перезаписи файлов; добавить их не сложно, но они делают код слишком длинным для однострочника. Если вы не против написать полный сценарий, что-то вроде этого должно сработать:
#!/usr/bin/perl
use strict;
use warnings;
foreach (<sol-temp_*.png>) {
my $orig = $_;
s%(\d+)%$1/5-1%e; # map "0010" -> "1", "0015" -> "2", etc.
next if $orig eq $_;
warn "$0: $_ exists, not renaming $orig\n" and next if -e $_;
rename $o, $_ or warn "$0: error renaming $orig to $_: $!\n";
}
(Вы можете даже легко изменить приведенный выше сценарий так, чтобы он считывал код подстановки и имена файлов из командной строки, просто сделайте так, чтобы это rename сценарий переименования , но это выходит за рамки этого ответа.)