Переименуйте файлы и каталоги с find -execdir | rename
Если вы собираетесь переименовывать как файлы, так и каталоги не просто с помощью суффикса, тогда это хороший шаблон:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
В отличие от этого, потрясающая -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
Смотрите также: /ubuntu/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
Требуется для того , чтобы файлы приходят после их соответствующих каталогов, так как более длинные пути приходят после того, как более короткие, с тем же префиксом.
rename
или Red Hatrename
?