Изменение имен файлов в подпапках после числа, извлеченного из подпапок

У меня есть папка с несколькими подпапками, внутри которой у меня есть файл с одинаковым именем во всех подпапках. Например:

  • abc/def_0/ghi.jpg
  • abc/def_5/ghi.jpg
  • abc/def_10/ghi.jpg
  • ... [+1132]
  • abc/pqr_0/ghi.jpg
  • abc/pqr_5/ghi.jpg
  • abc/pqr_10/ghi.jpg

Я хотел бы переименовать этот конкретный файл (ghi.jpg) во всех подразделах папки как:

  • abc/def_0/def_xyz_0.jpg
  • abc/def_5/def_xyz_5.jpg
  • abc/def_10/def_xyz_10.jpg
  • ...
  • abc/pqr_0/pqr_xyz_0.jpg
  • abc/pqr_5/pqr_xyz_5.jpg
  • abc/pqr_10/pqr_xyz_10.jpg

Я был бы признателен за любую помощь, так как я не смог найти решение для этого , Спасибо!

1
задан 25 June 2019 в 19:44

1 ответ

Для этого вы можете использовать file-rename . Если вы не знакомы с этим инструментом, я рекомендую запустить file-rename --version, чтобы проверить, есть ли он у вас - любой вывод, кроме ошибки, означает, что вы это делаете. Некоторые выпуски Ubuntu не поставляются с ним по умолчанию, поэтому у вас может не быть его, и в этом случае вы можете получить его, установив пакет rename. (Ошибка «команда не найдена», если у вас ее нет, скорее всего, даже расскажет вам об этом.)

cd в каталог abc, подкаталоги которого содержат файлы, которые вы хотите переименовать и запустить этот. Затем, если показанные операции переименования действительно те, которые вы хотите, запустите его снова без -n, чтобы выполнить фактическое переименование.

file-rename -n 's|^(.+)_(\d+)/ghi\.jpg$|$1_$2/$1_xyz_$2.jpg|' */ghi.jpg

Генерирует список файлов для переименования, используя глобул оболочки, и передает его в качестве аргументов file-rename для переименования. Предполагается, что вы хотите:

  • Переименовать файлы с точным именем ghi.jpg, которые находятся непосредственно в подкаталогах с именами, заканчивающимися на _, за которыми следуют цифры, каталога abc.
  • ]
  • Новое имя каждого файла будет содержать каталог, в котором он находится без завершающего подчеркивания и цифр, за которым следует xyz, после завершающего подчеркивания и цифр из имени содержащего каталога.

Способ, который работает, заключается в том, что s|pattern|substitution| работает с файлами, пути которых, поскольку они были переданы в качестве аргументов в file-rename, соответствуют pattern (интерпретируется как регулярное выражение в диалекте Perl ). Операция, которую он выполняет, состоит в том, чтобы переименовать их, используя указанные substitution . Файлы, имена которых не соответствуют pattern , не будут переименованы. В | нет ничего особенного в качестве выбора разделителя; Я просто не хочу использовать обычный /, так как он появляется в путях.

В шаблоне ^(.+)_(\d+)/ghi\.jpg$:

  • ^ соответствует началу пути, а $ соответствует концу. Это позволяет сопоставлять только все пути, которые были переданы, а не любую его часть.

    (Для устранения одной возможной путаницы: проходящие пути все еще являются относительными путями , такими как def_0/ghi.jpg, а не абсолютными путями, такими как /home/you/abc/def_0/ghi.jpg. Когда люди говорят о «полных путях», они обычно означают абсолютные пути. Под «полнотой пути» я подразумеваю каждый передаваемый аргумент, а не его меньшую подстроку.)

  • (.+) совпадает, а захватывает ( ( ) ) последовательность из одного или более ( + ) любого символа ( . ). Это входит в первую группу захвата.

  • _ соответствует самому себе, буквальный символ подчеркивания.

  • (\d+) соответствует и захватывает ( ( ) ) последовательность из одной или нескольких ( + ) цифр ( \d ). Это входит во вторую группу захвата.

  • / соответствует самому себе, символ буквального слеша. (Он не ведет себя как разделитель, потому что вместо него мы использовали | в качестве разделителя.)

  • ghi соответствует буквальному тексту ghi.

  • \. соответствует просто символу .. \ избегает .; в противном случае . будет означать «любой символ».

  • jpg соответствует буквальному тексту jpg.

Подстановка $1_$2/$1_xyz_$2.jpg означает:

  • Текст, который был помещен в первую группу захвата ($1). Это текст, который соответствует .+ в шаблоне.
  • Подчеркивание, _.
  • Текст, который был помещен во вторую группу захвата ($2). Это текст, который соответствует \d+ в шаблоне.
  • Косая черта, /.
  • Первая группа захвата ($1) снова.
  • Текст _xyz_.
  • Вторая группа захвата ($2) снова.
  • Точка, .. В отличие от шаблонов, в подстановках a . специально не обрабатывается, поэтому его не нужно (и не следует) экранировать с помощью \.
  • Текст jpg.

Для общей документации по использованию file-rename см. Выходные данные file-rename --help, man file-rename и этого сообщения в блоге . (Я использую file-rename вместо команды rename, потому что в некоторых системах rename - это другая утилита. В большинстве они одинаковы.)

0
ответ дан 25 June 2019 в 19:44

Другие вопросы по тегам:

Похожие вопросы: