Ganti nama file dan direktori dengan find -execdir | rename
Jika Anda akan mengubah nama file dan direktori tidak hanya dengan akhiran, maka ini adalah pola yang baik:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
-execdirOpsi yang luar biasa melakukan a cdke direktori sebelum mengeksekusi renameperintah, tidak seperti -exec.
-depth memastikan bahwa penggantian nama terjadi pertama kali pada anak-anak, dan kemudian pada orang tua, untuk mencegah kemungkinan masalah dengan direktori orang tua yang hilang.
-execdir diperlukan karena penggantian nama tidak berfungsi dengan baik dengan jalur input non-basename, misalnya yang gagal:
rename 's/findme/replaceme/g' acc/acc
The PATHhacking diperlukan karena -execdirmemiliki satu kelemahan yang sangat mengganggu: findyang sangat dogmatis dan menolak untuk melakukan apa saja dengan -execdirjika Anda memiliki path relatif di Anda PATHvariabel lingkungan, misalnya ./node_modules/.bin, gagal dengan:
find: Path relatif './node_modules/.bin' termasuk dalam variabel lingkungan PATH, yang tidak aman dalam kombinasi dengan aksi -execdir dari find. Harap hapus entri itu dari $ PATH
Lihat juga: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-in-the-path/1109378#1109378
-execdiradalah ekstensi menemukan GNU ke POSIX . renameberbasis Perl dan berasal dari renamepaket. Diuji di Ubuntu 18.10.
Ganti nama lookahead workaround
Jika jalur input Anda tidak berasal find, atau jika Anda sudah cukup mengalami gangguan jalur relatif, kita dapat menggunakan beberapa Perl lookahead untuk mengganti nama direktori dengan aman seperti di:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Saya belum menemukan analog yang cocok untuk -execdirdengan xargs: Xargs: ubah direktori kerja ke path file sebelum dieksekusi?
The sort -rdiperlukan untuk memastikan bahwa file datang setelah direktori masing-masing, karena jalur lagi datang setelah yang lebih pendek dengan awalan yang sama.
renameatau Red Hatrename?