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
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 примеры использования здесь .