Dosya ve klasörleri yeniden adlandır find -execdir | rename
Hem dosyaları hem de dizinleri sadece bir sonek ile değil, yeniden adlandıracaksanız, bu iyi bir kalıptır:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
Awesome -execdir
seçeneği cd
, rename
komutu çalıştırmadan önce dizine a yapar -exec
.
-depth
eksik ebeveyn dizinleri ile ilgili olası sorunları önlemek için yeniden adlandırma işleminin önce çocuklar üzerinde, sonra ebeveynler üzerinde yapıldığından emin olun.
-execdir
Yeniden adlandırma, temel ad değil giriş yollarıyla iyi çalışmadığından, örneğin aşağıdakilerin başarısız olması gerekir:
rename 's/findme/replaceme/g' acc/acc
Bilgisayar PATH
korsanlığı gereklidir, çünkü -execdir
çok can sıkıcı bir dezavantajı vardır: find
son derece tartışılır ve ortam değişkeninizde -execdir
göreceli yollarınız varsa PATH
, örneğin ./node_modules/.bin
:
find: './node_modules/.bin' göreceli yolu, find -execdir eylemiyle birlikte güvensiz olan PATH ortam değişkenine dahil edilir. Lütfen bu girişi $ PATH içinden kaldırın
Ayrıca bakınız: /ubuntu/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir
POSIX için bir GNU bulma uzantısıdır . rename
Perl tabanlıdır ve rename
paketten gelir . Ubuntu 18.10'da test edilmiştir.
Lookahead geçici çözümünü yeniden adlandır
Girdi yollarınız gelmiyorsa find
veya göreceli yol sıkıntısından yeterince kurtulduysanız, dizinleri aşağıdaki gibi güvenli bir şekilde yeniden adlandırmak için bazı Perl görünümlerini kullanabiliriz:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
Ben için uygun bir analog bulamadık -execdir
ile xargs
: Xargs: değişim yürütmeden önce dosya yoluna dizini çalışma?
sort -r
Uzun yollar aynı öneki ile kısa olanlar sonra gel beri dosyaları kendi dizinleri sonra gelmek sağlamak için gereklidir.
rename
veya Red Hat varrename
mı?