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