Як видалити кінцеві символи в іменах файлів у Bash?


13

У мене є багато медіа-файлів, як показано нижче:

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

Я хотів би перейменувати їх

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

Я спробував використати перейменування, але, очевидно, я не отримую правильного синтаксису, оскільки він не працює.


Якщо ви коли-небудь захочете це зробити, krename прекрасний. Він має всілякі потужні варіанти і показує вам, що він збирається робити, перш ніж він насправді робить це. Ви навіть можете використовувати його, щоб перевірити шаблони, які ви могли б використовувати в bash пізніше.
Joe

Відповіді:


9

Це дозволить перейменувати файли. Вам потрібно w * для позначення будь-якої кількості буквено-цифрових символів.

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

Довідка: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards


5
Зауважте, що це вимагає Perl rename корисність, а не таку ж назву від util-linux . Подивитися тут і тут
ilkkachu

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


@NoviceC шаблон extglob не був поганою ідеєю. Власне, щось подібне ${x/]*([^.])} слід робити, він видаляє дужку і будь-яку кількість не-точок. (хоч і невдало, якщо є інші дужки або крапки, оскільки він не заблокований до кінця рядка)
ilkkachu

Це хороший момент. Але я дійсно просто ускладнив це питання, коли я повинен був піти з ${x/]*.avi} і просто додав a .avi як ти. Але я також був незадоволений тим, як простори в імені зламаються (`find . -name '*]*.avi'`). Я був щасливий запропонувати обмежений стандартний метод команди unix, оскільки перейменування не є, але це викидає міну з води.
Novice C

2

Це все непрактично - інші відповіді набагато швидше і коротше - але ...

Можна використовувати PowerShell! Microsoft відкритим джерелом Останнім часом і зробив його крос-платформенним. Інструкції з завантаження та інсталяції для ОС див розділ "Отримати 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, але я хотів показати те, що зрозуміло людям, які не знають регулярних виразів.)


Рубі Голдберг буде пишатися! Regexes є реальний PITA щоб довідатися, але вони варті це багато разів нагорі - навіть у rudimentary рівні я можу використати їх у.
Joe

1

У Debian називається пакет ммв які також можуть бути доступні в інших дистрибутивах, і повинні бути досить легкими для компіляції з джерела, якщо ні. Це дозволяє вам написати це:

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

Ви можете прочитати Людина-сторінка Ubuntu для цієї команди для отримання додаткової інформації.


0

Це призведе до пошуку шаблону та заміни тексту за допомогою sed.

 $sed 's/\(.*]\)[a-zA-z0-9].*\(.avi\)/\1\2/' filename
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.