Переименование файлов с использованием регулярного выражения в 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
Ответы
Ответ 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
, доступного в моей системе.