В вашем конкретном случае вы можете использовать следующую 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] Назначение специального аргумента --, который поддерживается большинством утилит, состоит в том, чтобы сигнализировать, что последующие аргументы должны рассматриваться как операнды (значения), даже если они выглядят как опции из-за того, что они начинаются с -, как отмечает Джейкоб К.