Перейменуйте файли за допомогою однієї рядкової команди


10

Я маю цей каталог і хочу перейменувати файли:

===> ls -1 Der-vierte-Weise/
10 - 10 - Erkenntniss.ogg
1 - 01 - Hoffnung.ogg
11 - 11 - Wahrheit.ogg
12 - 12 - Dankbarkeit.ogg
13 - 13 - Kredits.ogg
2 - 02 - Familie.ogg
3 - 03 - Demut.ogg
4 - 04 - Freude.ogg
5 - 05 - Schoenheit.ogg
6 - 06 - Solidaritaet.ogg
7 - 07 - Entscheidung.ogg
8 - 08 - Hilfe.ogg
9 - 09 - Unterstuetzung.ogg

Результат повинен виглядати приблизно так:

===> ls -1 Der-vierte-Weise/
01 - Hoffnung.ogg
02 - Familie.ogg
...

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


1
Я хотів би вирішити це за допомогою звичайних інструментів для оболонок. Я не кажу, що у вас немає вагомих причин, але я вірю, що ви задали і відповіли на запитання собі "чому?". Востаннє у мене була дуже схожа проблема, яку потрібно вирішити, я негайно відсунув Баша в один бік і вирішив його в Python. Так набагато простіше (але я вже знав Python, рядкові методи, glob.glob та os.rename - і мені також довелося повторювати дерево, повне імен папок з пробілами та іншими незручними символами, жоден з яких не є причиною зайвих турбуйтеся, якщо використовуєте Python)
nigel222

1
@ nigel222 Я лінивий і хочу набрати якомога менше символів. Тому я не хочу тут використовувати python. Не зрозумій мене неправильно. На сьогоднішній день Python є моєю улюбленою мовою програмування та використовую її щодня.
guettli

Відповіді:


18

Ви можете використовувати rename...

rename -n 's/^[0-9]+ - //' *

Видаліть -nпісля тестування, щоб фактично перейменувати файли

Пояснення

  • s/old/new/замінити oldнаnew
  • ^ початок рядка
  • [0-9]+ деякі числа

яка квітка регексу підтримується renameінструментом. Він використовує PCRE? ... було б здорово.
guettli

5
@guettli строго кажучи, ні це не PCRE (це сумісні регулярні вирази Perl ). renameЄ сценарій Perl , так що має повний Perl підтримка регулярних виразів; PCRE - лише підмножина цього. Однак все, що ви знаєте з PCRE, буде застосовано до rename.
тердон

@terdon Мене не хвилює реалізація. Якщо ви дивитесь на це за допомогою математичних окулярів, то в них renameє сумісні регулярні вирази perl. Так, реалізація pcre не звикає. Я зрозумів це :-) Дякую за швидку відповідь.
guettli

9

bash Розширення параметра для зняття необхідної частини від початку:

for f in *[[:blank:]]*.ogg; do echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Розгорнута форма:

for f in *[[:blank:]]*.ogg; do 
    echo mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"
done

echoпризначений для сухого бігу; позбудьтеся його для фактичних дій:

for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done

Приклад:

% ls -1
1 - 01 - Hoffnung.ogg
2 - 02 - Familie.ogg

% for f in *[[:blank:]]*.ogg; do mv -i -- "$f" "${f#[[:digit:]]*-[[:blank:]]}"; done 

% ls -1                                                                             
01 - Hoffnung.ogg
02 - Familie.ogg

Так, працює. Дякую. Оскільки я знаю сумісний регулярний вираз з Python (який я використовую щодня), я віддаю перевагу renameкоманді. (Менше потрібно вводити).
guettli

1
@guettli rename- це шлях, якщо ви знайомі з PCRE; renameвідповідь була вже дано так повинен рухатися з чистим bash. Зауважимо лише, pythonщо re(або regex) модуль не повністю сумісний з PCRE BTW.
heemayl

@guettli Ви також щойно відхилили мою відповідь? : O
heemayl

Так, я і підтримав ваш коментар. Я сподіваюся, ви не сприймаєте це особисто. Не зрозумійте мене неправильно, але моя особиста думка - це ${f#[[:digit:]]*-[[:blank:]]}некрасиво. Так, це працює. Але ми живемо в 21 столітті. Я думаю, що час перейти з "це працює" на "це легко і весело". Якщо мета "це працює", то Linux ніколи не втратить забобони не бути зручними для користувачів. Оскільки ви вже отримали багато голосів, цей голос не повинен шкодити (сподіваюся). Якщо це станеться, скажіть, і я візьму його назад.
guettli

1
@guettli Що б вам не підходило. Тут: gnu.org/software/bash/manual/html_node/… Зауважимо лише, клас персонажів [[:digit:]]і чи [[:blank:]]були вони там, щоб відповідати вашим locale, вони теж досить часто зустрічаються в Regex.
heemayl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.