Подтвердить что ты не робот

Переименование файлов с использованием регулярного выражения в linux

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

Friends - 6x03 - Tow Ross' Denial.srt
Friends - 6x20 - Tow Mac and C.H.E.E.S.E..srt
Friends - 6x05 - Tow Joey Porshe.srt

и я хочу переименовать их, как показано ниже.

S06E03.srt
S06E20.srt
S06E05.srt

что мне делать, чтобы сделать работу в терминале linux? Я установил rename, но U получаю ошибки, используя следующее:

rename -n 's/(\w+) - (\d{1})x(\d{2})*$/S0$2E$3\.srt/' *.srt
4b9b3361

Ответ 1

Вы забыли точку перед звездочкой:

rename -n 's/(\w+) - (\d{1})x(\d{2}).*$/S0$2E$3\.srt/' *.srt

В OpenSUSE, RedHat, Gentoo вам нужно использовать Perl-версию rename. Этот ответ показывает, как его получить. На Arch пакет называется perl-rename.

Ответ 2

Не все дистрибутивы поставляют утилиту rename, которая поддерживает регулярные выражения, используемые в приведенных выше примерах - RedHat, Gentoo и их производные среди других.

Альтернативы для использования - perl-rename и mmv.

Ответ 3

Я бы сделал оболочку script для этого:

#!/bin/sh
IFS='
'
for file in `ls -1 *.srt`; do
  newname=`echo "$file" | sed 's/^.*\([0-9]\+\)x\([0-9]\+\).*$/S0\1E\2.srt/'`
  mv "$file" "$newname"
done

Ответ 4

Вы можете использовать rnm:

rnm -rs '/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt/' *.srt

Пояснение:

  • -rs: заменить строку формы /search_regex/replace_part/modifier
  • (\d) и (\d+) в (\d)x(\d+) - две захваченные группы (\1 и \2 соответственно).

Дополнительные примеры здесь.

Ответ 5

Если ваш Linux не предлагает переименовать, вы также можете использовать следующее:

find . -type f -name "Friends*" -execdir bash -c 'mv "$1" "${1/\w+\s*-\s*(\d)x(\d+).*$/S0\1E\2.srt}"' _ {} \;

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

Я не очень хорошо разбираюсь в оболочке, но насколько я понимаю этот код, его объяснение будет таким: результаты поиска вашей находки будут переданы в bash -command (bash - c) где ваш результат поиска будет в пределах $1 в качестве исходного файла. следующая цель - результат подстановки в пределах подоболочки, где содержание $1 (здесь: всего 1 внутри вашего параметра-substituion { 1//find/replace}) также будет вашим поиском результат. {} передает его содержимому -execdir

лучшие объяснения будут оценены много:)

обратите внимание: я только скопировал ваше регулярное выражение; сначала проверьте файлы примеров. в зависимости от вашей системы вам может потребоваться изменить \d и\w на классы символов, такие как [[: digit:]] или [[: alpha:]]. однако \1 должен работать для групп.

Ответ 6

mmv прост, но полезен. Он использует * для любой строки и ? для любого символа в строке соответствия и #X в строке замены, чтобы обратиться к X-му совпадению.

В вашем случае:

mmv 'Friends - 6x?? - Tow *.srt' 'S06E#1#2.srt'

Здесь #1#2 представляют две цифры, которые записываются ?? (совпадение # 1 и # 2).

mmv также предлагает сопоставление [ и ] и ;, прочитайте справочную страницу для более!

Ответ 7

Действительно холодно lil diddy.

xargs -n2 позволяет печатать два аргумента на строку. В сочетании с Perl print $_ (чтобы сначала напечатать $STDIN), он создает мощный инструмент переименования.

find . -type f | perl -pe 'print $_; s/DVDCover/DVDCoverLabel/' | xargs -n2 mv

Результаты perl -pe 'print $_; s/OldName/NewName/' | xargs -n2 заканчиваются:

OldName.ext    NewName.ext
OldName.ext    NewName.ext
OldName.ext    NewName.ext
OldName.ext    NewName.ext

У меня не было Perl rename, доступного в моей системе.