Як створити пакетне перейменування файлів у терміналі macOS?


123

У мене папка із серією файлів з назвою:

prefix_1234_567.png
prefix_abcd_efg.png

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

prefix_567.png
prefix_efg.png

Відповідні, але не повністю пояснювальні:


дивіться на діапазон та методи підрядок NSString та NSMutableString
Grady Player

1
Чи розглядали ви нетермінальні рішення щодо цього? Робочий процес Автоматизатора може легко виконувати ці типи операцій. Ви можете створити робочий процес автоматизатора, щоб перейменувати всі файли та замінити текст _*_порожнім.
Шифроване

Я думав, що автоматизатор не міг робити
макіяжів

Відповіді:


234

У вашому конкретному випадку ви можете використовувати таку bashкоманду ( bashоболонка за замовчуванням у macOS):

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

Примітка. Якщо є ймовірність початку ваших імен файлів -, поставте -- перед ними [1]:
mv -- "$f" "${f/_*_/_}"

Примітка: попередньо echoпередбачено mvтак, щоб здійснити сухий пробіг. Видаліть його, щоб виконати фактичне перейменування.

Ви можете запустити його з командного рядка або використовувати його в скрипті.

  • "${f/_*_/_}"є застосуванням bash розширення параметрів : шаблон _*_( узгодження) підрядкових рядків замінюється буквальним _, ефективно вирізаючи середній маркер з імені.
  • Зауважте, що _*_це шаблон (виразний вираз, який також використовується для глобулювання), а не звичайний вираз (щоб дізнатися про шаблони, запустіть man bashі шукайте Pattern Matching).

Якщо ви часто знаходите файли перейменування файлів, подумайте про встановлення спеціалізованого інструменту, такого як renameутиліта Perl . На macOS ви можете встановити його за допомогою популярного менеджера пакунків Homebrew наступним чином:

brew install rename

Ось еквівалент команди вгорі за допомогою rename:

rename -n -e 's/_.*_/_/'  *.png

Знову ж таки, ця команда виконує сухий пробіг; видалити, -nщоб виконати фактичне перейменування.

  • Подібно до bashрішення, s/.../.../виконує підміну тексту, але - на відміну від bash- використовуються справжні регулярні вирази .

[1] Метою спеціального аргументу --, який підтримується більшістю утиліт, є сигналізація про те, що наступні аргументи слід трактувати як операнди (значення), навіть якщо вони виглядають як варіанти, починаючи з того -, як зазначає Якоб С.


3
чудова відповідь, спрацював чудово. Я також вдячний, що ти повернувся назад і відредагував це, щоб пояснити це більше і запропонувати більш елегантне рішення, якщо я повторю це. ще раз, велике спасибі, дуже корисно
kidnim

4
Приклад використання відповідних замін ( .*-> $1), наприклад Перейменування Foo bar S01E01 biz baz.extна S01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
Стів Роббінс

2
Любіть ідею використання echoдля сухих трас. Дякую за пораду!
Джеймс Райт

Дуже рекомендую просто робитиbrew install rename
Кріс Редфорд,

98

Для перейменування файлів можна скористатися renameутилітою:

brew install rename

Наприклад, щоб змінити рядок пошуку у всіх назви файлів у поточному каталозі:

rename -nvs searchword replaceword *

Видаліть параметр 'n', щоб застосувати зміни.

Більше інформації: man rename


1
OS Xверсії GNU bash( x86_64-apple-darwin ) не містять утиліту перейменування.
l'L'l

4
Дякую, так, його потрібно встановити черезbrew install rename
Девід Томас

2
Ця порада приголомшлива! Я набрав rename -vs GLYCOPHORIN GLYCC *і тепер автоматично перейменував 450+ файлів. І надто швидко теж.
Sander W. van der Laan

3
Відмінно! Любіть "показуйте, що було б змінено" частина БЕЗПЕЧЕ це насправді перейменує речі!
Бен Даффін

3
Ви також можете використовувати регулярний вираз. перейменуйте 's / 123 / onetwothree / g' *
Брайан

12

Ви можете використовувати sed:

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

результат:

prefix_567.png prefix_efg.png

* спочатку зробити сухий запуск, замінивши mvв кінці наecho

Пояснення:

  • е: необов’язково для команди лише 1 sed.
  • p: для друку введення в sed, в цьому випадку це буде оригінальне ім'я файлу перед будь-яким перейменуванням
  • @: це заміна / символу, щоб зробити sed більш читабельним. Тобто замість sed / пошук / заміна / g використовуйте s @ search @ substitu @ g
  • _. *: підкреслення - символ втечі для позначення фактичного "." символ нуль або більше разів (на відміну від БУДЬ-якого символу в регулярному виразі)
  • -n2: вказує, що є 2 виходи, які потрібно передати mv як параметри. на кожен вхід з ls , ця команда sed буде генерувати 2 виведення, які потім надходять до mv.

1
Розумний, якщо дещо таємний розчин. Зробити це більш загальним, щоб також підтримувати назви файлів із вбудованими пробілами, стає ще більш прихованим: ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'(видалити, echoщоб насправді перейменувати).
mklement0

2
Таємничий? Я обожнюю це!
Білал Акіл

7

У мене була група файлів, яка виглядала приблизно так: be90-01.png і мені потрібно було змінити тире на підкреслення. Я використав це, що добре працювало:

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done

2

Ви можете встановити renameкоманду за допомогою brew. просто зробіть brew install renameі використовуйте це.


1

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

mmv '*_*_*' '#1_#3' *.png

вам потрібно встановити спочатку sudo apt-get install mmv.
αғsnιη

1
Враховуючи, що це була OS X, правильна процедура встановлення brew install mmv.
buckaroo1177125

1

спробуйте це

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

Ось ще один спосіб:

for file in Name*.png; do mv "$file" "01_$file"; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.