Mac OS X Терминал пакетного переименования

У меня есть папка с серией файлов с именем:

prefix_1234_567.png
prefix_abcd_efg.png

я хотел бы пакетное удаление одного подчеркивания и среднего содержимого, чтобы вывод был

prefix_567.png
prefix_efg.png

Спасибо, что актуально, но не полностью объясняет: как я могу переименовать файлы с помощью Терминала? Regex для пакетного переименования файлов в OS X Terminal

9 ответов

Решение

В вашем конкретном случае вы можете использовать следующее 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).

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

brew install rename

Вот эквивалент команды в верхней части, используя rename:

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

Опять же, эта команда выполняет пробный прогон; Удалить -n выполнить реальное переименование.

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

[1] Цель специального аргумента -- , который поддерживается большинством утилит, должен сигнализировать, что последующие аргументы должны рассматриваться как операнды (значения), даже если они выглядят как опции из-за запуска с - , как отмечает Jacob C..

Чтобы переименовать файлы, вы можете использовать rename полезность:

brew install rename

Например, чтобы изменить строку поиска во всех именах файлов в текущем каталоге:

rename -nvs searchword replaceword *

Удалите параметр 'n', чтобы применить изменения.

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

Вы можете использовать sed:

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

результат:

prefix_567.png prefix_efg.png

* сначала выполнить пробный прогон, заменить mv в конце с echo

У меня был пакет файлов, который был похож на это: be90-01.png и мне нужно было изменить черту, чтобы подчеркнуть. Я использовал это, который работал хорошо:

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

Вы можете установить rename команда с помощью brew, просто делать brew install rename и использовать это.

Попробуй это

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

Вот еще один способ:

for file in Name*.png; do mv "$file" "01_$file"; done

С помощью mmv

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

zshтеперь является оболочкой по умолчанию для macOS и имеет собственную функцию массового переименования.zmvкоторый иногда называютmmvкnoglob zmv -W.

Поскольку программное переименование файлов рискованно (потенциально разрушительно, если вы ошиблись), я бы использовал инструмент с режимом запуска, созданный специально для массового переименования, например пробногоrenamer .

Эта команда работает со всеми файлами в текущем каталоге, используйте --dry-run пока вы не будете уверены, что результат будет правильным:

      $ renamer --find "/(prefix_)(\w+_)(\w+)/" --replace "$1$3" -e name --dry-run *

Dry run

✔︎ prefix_1234_567.png → prefix_567.png
✔︎ prefix_abcd_efg.png → prefix_efg.png

Rename complete: 2 of 2 files renamed.

Еще много Renamer примеры использования здесь .

Другие вопросы по тегам