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


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.