Можно ли написать скрипт для переименования серии файлов, как показано ниже:

  • sol-temp_0010.png в sol-temp_1.png
  • sol-temp_0015.png в sol-temp_2.png
  • sol-temp_0020.png в sol-temp_3.png

так далее.?

1 ответ1

1

Команда 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 сценарий переименования , но это выходит за рамки этого ответа.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .