Переименуйте несколько файлов из командной строки

Возможный дубликат:
Переименование множества файлов в Linux по шаблону

У меня есть несколько файлов в этом формате:

file_1.pdf
file_2.pdf
...
file_100.pdf

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

file_001.pdf
file_002.pdf
...
file_100.pdf

Я знаю, что вы можете переименовать несколько файлов с помощью «переименовать», но я не знаю, как это сделать в этом случае.


person Simon Dirmeier    schedule 14.01.2013    source источник
comment
theunixshell.blogspot.com/2013/01/   -  person Vijay    schedule 15.01.2013
comment
socialtext.net/perl5/prename   -  person daxim    schedule 21.01.2013


Ответы (2)


Это можно сделать с помощью Perl-инструмента rename из приглашения shell. (Есть другие инструменты с тем же именем, которые могут или не могут сделать это, поэтому будьте осторожны.)

rename 's/(\d+)/sprintf("%03d", $1)/e' *.pdf

Если вы хотите выполнить пробный запуск, чтобы убедиться, что вы не затираете файлы, добавьте в команду переключатель -n.

примечание

Если вы выполните следующую команду (linux)

$ file $(readlink -f $(type -p rename))

и у вас есть результат, как

.../rename: Perl script, ASCII text executable

тогда это, кажется, правильный инструмент =)

Кажется, это команда rename по умолчанию для Ubuntu.

Чтобы сделать его значением по умолчанию для Debian и производным, например Ubuntu :

sudo update-alternatives --set rename /path/to/rename

Пояснения

  • s/// - это базовое выражение подстановки: s/to_replace/replaced/, проверьте perldoc perlre
  • (\d+) захватить с помощью () хотя бы одно целое число: \d или больше: + в $1
  • sprintf("%03d", $1) sprintf похоже на printf, но используется не для печати, а для форматирования строки с тем же синтаксисом. %03d — для заполнения нулями, а $1 — захваченная строка. Проверить perldoc -f sprintf
  • более поздняя функция Perl разрешена из-за модификатора e в конце выражения
person Gilles Quenot    schedule 14.01.2013
comment
Кажется, это не имеет никакого смысла. Как это связано с Perl? Стандартный Linux rename не имеет -n и не поддерживает расширенную замену sed-style. Perl rename очень прост и не может этого сделать по умолчанию. Что это? Пожалуйста, приведите более подробный пример. - person mvp; 15.01.2013
comment
rename в CPAN действительно имеет -n. - person ikegami; 15.01.2013
comment
Если у вас двоичный файл ELF вместо Perl, это другой инструмент, не имеющий ничего общего с объясненным. - person Gilles Quenot; 04.01.2017
comment
У меня нет опыта работы с Perl, но я знаю регулярные выражения. Не могли бы вы обновить это, чтобы кратко объяснить его использование в более широком смысле? Мне лично удалось удалить расширение .txt из некоторых файлов с rename s/(.*).txt/sprintf($1)/e' *.txt, но я не до конца понимаю, как это работает. Что такое s в начале и /e в конце, и почему оператор печати находится сразу после регулярного выражения? - person Keavon; 21.03.2017
comment
Добавлены пояснения - person Gilles Quenot; 23.03.2017

Если вы хотите сделать это с помощью чистого bash:

for f in file_*.pdf; do x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")"; done

(обратите внимание на отладочное эхо)

person Gilbert    schedule 15.01.2013