Dosyaları yeniden adlandırmak istiyorsanız bazı sorunlarla karşılaşacaksınız. ve aynı anda rehberler. Sadece bir dosyayı yeniden adlandırmak yeterince kolaydır. Ancak, dizinlerin de yeniden adlandırıldığından emin olmak istiyorsunuz. Basitçe yapamazsın mv Motörhead/Encöding Motorhead/Encoding dan beri Motorhead çağrı sırasında var olmayacak.
Bu nedenle, tüm dosya ve klasörlerin derinlemesine bir geçişine ihtiyacımız var ve ardından yalnızca geçerli dosya veya klasörü yeniden adlandırıyoruz. GNU ile aşağıdaki işler find ve OS X'imde Bash 4.2.42.
#!/usr/bin/env bash
find "$1" -depth -print0 | while IFS= read -r -d '' file; do
d="$( dirname "$file" )"
f="$( basename "$file" )"
new="${f//[^a-zA-Z0-9\/\._\-]/}"
if [ "$f" != "$new" ] # if equal, name is already clean, so leave alone
then
if [ -e "$d/$new" ]
then
echo "Notice: \"$new\" and \"$f\" both exist in "$d":"
ls -ld "$d/$new" "$d/$f"
else
echo mv "$file" "$d/$new" # remove "echo" to actually rename things
fi
fi
done
Regex’i kullanarak değiştirebilirsiniz. new="${f//[\\\/\:\*\?\"<>|]/}" Windows'un işleyemediği bir şeyi değiştirmek istiyorsanız.
Bu betiği farklı kaydet rename.shile çalıştırılabilir olmasını sağlayın chmod +x rename.sh. Öyleyse, ara rename.sh /some/path.
Dosya adı çakışmalarını çözdüğünüzden emin olun (“ Notice ”Duyurular).
Eğer öyleysen kesinlikle emin doğru değiştirmeleri yapar, echo Senaryodan aslında ne yaptığını basmak yerine işleri yeniden adlandırmak için
Güvende olmak için önce bunu küçük bir dosya alt kümesinde test etmenizi tavsiye ederim.
Seçenekler açıklandı
Burada neler olduğunu açıklamak için:
-depth dizinlerin derinlikli olarak tekrarlanmasını sağlayacak, böylece her şeyi baştan sona "yuvarlayabiliyoruz". Genellikle, find farklı şekilde traversler (ancak en başta birinci değil).
-print0 sağlar find çıktı null ayrılmış, bu yüzden onu okuyabiliriz read -d '' içine file değişken. Bunu yapmak, boşluk içerenler ve hatta yeni satırlar dahil olmak üzere her tür garip dosya ismini kullanmamıza yardımcı olur.
- Dosyanın dizinini alacağız
dirname. Değişkenlerinizi her zaman uygun şekilde alıntılamayı unutmayın, aksi halde boşluklu veya genel karakterli herhangi bir yol bu komut dosyasını kırabilir.
- Asıl dosya adını (veya dizin adını) alacağız
basename.
- Ardından geçersiz karakterleri kaldırdık
$f Bash'in dize değiştirme yeteneklerini kullanarak. Geçersiz, küçük veya büyük harf, rakam, eğik çizgi olmayan herhangi bir şey anlamına gelir ( \/ ), bir nokta ( \. ), bir alt çizgi veya eksi - kısa çizgisi.
- Eğer
$f zaten temiz (temizlenen ad, geçerli isimle aynı), atlayın.
- Eğer
$new dizinde zaten var $d (örneğin, adlandırılmış dosyalarınız var. resume ve résumé Aynı dizinde), bir uyarı verin. Yeniden adlandırmak istemezsiniz, çünkü bazı sistemlerde mv foo foo soruna neden olur. Aksi takdirde,
- Sonunda orijinal dosyayı (veya dizini) yeni adıyla yeniden adlandırdık.
Bu sadece en derin hiyerarşide hareket edeceğinden, yeniden adlandırarak Motörhead/Encöding için Motorhead/Encoding iki adımda yapılır:
mv Motörhead/Encöding Motörhead/Encoding
mv Motörhead Motorhead
Bu, tüm değiştirmelerin doğru sırada yapılmasını sağlar.
Örnek dosyalar ve test çalıştırması
Bazı dosyaları bir temel klasörde bulalım. test:
test
test/Motörhead
test/Motörhead/anöther_file.mp3
test/Motörhead/Encöding
test/Randöm
test/Täst
test/Täst/Töst
test/with space
test/with-hyphen.txt
test/work
test/work/resume
test/work/résumé
test/work/schedule
İşte hata ayıklama modunda bir çalışmadan çıktı echo önünde mv ),
yani, çağrılacak olan komutlar ve çarpışma uyarıları:
mv test/Motörhead/anöther_file.mp3 test/Motörhead/another_file.mp3
mv test/Motörhead/Encöding test/Motörhead/Encoding
mv test/Motörhead test/Motorhead
mv test/Randöm test/Random
mv test/Täst/Töst test/Täst/Tost
mv test/Täst test/Tast
mv test/with space test/withspace
Notice: "resume" and "résumé" both exist in test/work:
-rw-r—r-- … … test/work/resume
-rw-r—r-- … … test/work/résumé
İçin mesaj bulunmadığına dikkat edin. with-hyphen.txt, schedule, ve test kendisi.
mvzaten var, bu, (1) zaten temiz olan dosyalarınız varsa ortaya çıkabilir (sonuçtamv foo foo) veya (2) özel karakterler dışında aynı ada sahip dosyalarınız varsa (ör.mv Encöding Encoding, zaten sahip olduğunuz birEncodingek olarak dosyaEncöding).