Можно ли написать скрипт для переименования серии файлов, как показано ниже:
sol-temp_0010.png
вsol-temp_1.png
sol-temp_0015.png
вsol-temp_2.png
sol-temp_0020.png
вsol-temp_3.png
так далее.?
Можно ли написать скрипт для переименования серии файлов, как показано ниже:
sol-temp_0010.png
в sol-temp_1.png
sol-temp_0015.png
в sol-temp_2.png
sol-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
сценарий переименования , но это выходит за рамки этого ответа.)