На основі шаблону, перейменування пакетного файлу в терміналі


48

Мені потрібно перейменувати наступне:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

в

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

Як я можу це зробити лише за допомогою одного простого рядка термінальної команди?


1
Відмовостійкий регулярний вираз-версія пітона , яка працює рекурсивно по всіх вкладених папок: stackoverflow.com/a/39698169/191246
— ccpizza

Відповіді:


79

Рішення вищевказаного прикладу з використанням перейменування :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Використання:

rename [options] [Perl regex search/replace expression] [files]

Від man rename:

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

перейменувати МОЖЕ прийняти регулярні вирази як аргументи

Ми дивимось на зміст між цитатами '. Ви можете розмістити шрифт, розділений на /.

Формула: s/(1)/(2)/де (1)= шаблон пошуку та (2)= замінити шаблон.

Отож, ознайомтеся з regex та насолоджуйтесь перейменуванням пакетного файлу на основі шаблону!


14
Я знаю, що це Ubuntu, але якщо хтось опиниться тут, навіть якщо шукав рішення для OS X (я це робив), renameце легко встановити brew install rename.
— пісок

У Ubuntu 18.10 --no-actпрапор --nonoзамість цього. Ця відповідь також може бути дещо чіткішою: [files]стосується початкових файлів відповідності шаблонів у поточному каталозі, які можна потенційно перейменувати (наприклад, *відповідає всім, але тільки в поточному каталозі).
— Патрік Темний

Ваше посилання вказує на інший rename, який має формат rename from to fileі не підтримує регулярні вирази. Насправді мій дистрибутив Linux (Cent OS 7) має саме таку версію.
— Алекс Че

6

якщо файли знаходяться в кількох каталогах, використовуйте перейменування після знаходження типу:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

після перейменування слід перевірити, видаліть його для продовження! -)

як це, ви асоціюєте пошук і перейменування влади.

Особисто я використовував його для перейменування заголовка джерел .h на .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

Там в документації для -iname, -typeі -execпрапори в manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression . ( find --helpне особливо корисно для цієї команди.) TL; DR: -inameвідповідає випадку шаблону - невідчутливо; -type fвідповідає "звичайним файлам"; і -execвиконує вираз до тих пір, поки він не зустріне ;(крапки з комою).
— Патрік Темний

5

Це можна зробити за допомогою магії розширення параметрів bash!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;- Перший шаблон використовується для проходження всіх файлів, які починаються з 'file_anynumber_'
${f#file_[0-9]*_}- Другий шаблон file_[0-9]*_використовується в розширенні параметрів, який повідомляє bash видалити 'file_anynumber_' з молювання рядка.

Для отримання додаткової інформації про Parameter expansion:

man bash

Зауважте, що для цього використовуються глобуси, а не регулярні вирази, тому [0-9]*вони відповідатимуть одній цифрі, а потім будь-якій рядку. Напевно, є кращий спосіб зіставити лише цифри, але я нічого не можу придумати.
— wjandrea

Чи могли б ви також запропонувати спосіб, щоб ця команда рекурсивно працювала у всіх підкаталогах?
— Франческо ДМ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.