13

У меня есть куча медиа-файлов, как показано ниже:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

Я хотел бы переименовать их в

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

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

5 ответов5

14

В оболочке можно сделать просто:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

Оболочка может создать список имен файлов с помощью обычного глобуса, а ${var%pattern} удаляет (самый короткий) совпадающий шаблон из конца строки в переменной var . Так как окончательное расширение всегда .avi , я просто удалил его с шаблоном и добавил обратно. С кавычками это должно работать и с именами файлов, содержащими пробелы, например, Fancy Name for a Show.s01e01]Asdf.avi

9

Это переименует файлы. Вам нужна \w * для обозначения любого количества буквенно-цифровых символов.

rename 's/\]\w*//' *

Ссылка:http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards

2

Это все виды непрактично - другие ответы гораздо быстрее и короче - но ...

Вы можете использовать PowerShell! Microsoft недавно открыла его и сделала его кроссплатформенным. Инструкции по загрузке и установке для вашей ОС см. В разделе "Get PowerShell".

Как только вы установите его, вы можете использовать этот краткий скрипт:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

По сути, он проходит через каждый объект в текущем каталоге, который является файлом, соответствующим *]*.avi , получает деталь перед скобкой, прикрепляет к ней .avi и назначает ее как новое имя.

Чтобы запустить его прямо из Bash, используйте этот однолинейный полугольфорный:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

Цитата избегает любезности этого ответа переполнения стека.

(Проверено в Bash на Ubuntu на Windows. Вероятно, есть гораздо более короткий способ сделать это с PowerShell, но я хотел показать что-то понятное людям, которые не знают регулярных выражений.)

1

В Debian есть пакет mmv, который также может быть доступен в других дистрибутивах и должен быть достаточно простым для компиляции из исходного кода, если нет. Это позволяет вам написать это:

mmv '*]*.avi' '#1.avi'

Вы можете прочитать справочную страницу по Ubuntu для этой команды для более подробной информации.

0

Это будет искать шаблон и заменить текст с помощью sed.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename

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