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.sh
ile ç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.
mv
zaten 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 birEncoding
ek olarak dosyaEncöding
).