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/' '{}' \;
-execdir
Opsi yang luar biasa melakukan a cd
ke direktori sebelum mengeksekusi rename
perintah, 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 PATH
hacking diperlukan karena -execdir
memiliki satu kelemahan yang sangat mengganggu: find
yang sangat dogmatis dan menolak untuk melakukan apa saja dengan -execdir
jika Anda memiliki path relatif di Anda PATH
variabel 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
-execdir
adalah ekstensi menemukan GNU ke POSIX . rename
berbasis Perl dan berasal dari rename
paket. 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 -execdir
dengan xargs
: Xargs: ubah direktori kerja ke path file sebelum dieksekusi?
The sort -r
diperlukan untuk memastikan bahwa file datang setelah direktori masing-masing, karena jalur lagi datang setelah yang lebih pendek dengan awalan yang sama.
rename
atau Red Hatrename
?