Перейменуйте файли та каталоги за допомогою 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
?