Переименовывайте файлы и каталоги с помощью find -execdir | rename
Если вы собираетесь переименовывать как файлы, так и каталоги не просто с помощью суффикса, тогда это хороший шаблон:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
Параметр awesome -execdir делает cd в каталог перед выполнением команды rename , в отличие от -exec .
-depth убедитесь, что переименование происходит сначала для детей, а затем для родителей, чтобы предотвратить потенциальные проблемы с отсутствующими родительскими каталогами.
-execdir требуется, потому что переименование плохо работает с путями ввода неосновного имени, например, следующие ошибки:
rename 's/findme/replaceme/g' acc/acc
Взлом PATH необходим, потому что -execdir имеет один очень раздражающий недостаток: find чрезвычайно самоуверен и отказывается что-либо делать с -execdir если у вас есть относительные пути в переменной окружения PATH , например, ./node_modules/.bin , в случае сбоя:
find: Относительный путь «./node_modules/.bin» включен в переменную среды PATH, которая небезопасна в сочетании с действием -execdir команды find. Пожалуйста, удалите эту запись из $ PATH
Смотрите также: https://askubuntu.com/questions/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir является расширением GNU find для POSIX. rename основано на Perl и происходит из пакета rename . Проверено в Ubuntu 18.10.
Переименовать обходное решение
Если ваши входные пути не получены из find , или если вам надоело относительное раздражение пути, мы можем использовать некоторые возможности Perl для безопасного переименования каталогов, как в:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Я не нашел удобного аналога для -execdir с xargs: xargs: перед выполнением изменить рабочий каталог на путь к файлу?
sort -r необходима для того, чтобы файлы следовали за соответствующими каталогами, поскольку более длинные пути идут после более коротких с тем же префиксом.