Перейменуйте файли та каталоги за допомогою 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 пошуку. Видаліть цей запис із $ PATH
Дивіться також: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdirє розширенням пошуку GNU до 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?