BASH komut dosyası için oldukça yeniyim ve görevimi çözmenin zarif bir yolunu arıyorum:
Belirli bir dizinde, belirli dosyaların düzenli olarak alt klasörlere ayrılması gerekir. Dosyaların adı sabit bir yapıya sahiptir ve bu dosyaların yerleştirileceği hedef klasör, adlarına bağlıdır.
Şu anda senaryolarım şöyle gözüküyor:
#!/bin/bash
declare -r SOURCEDIR=/some/dir/upload
declare -r DESTBASEDIR=/some/dir/archive
for year in "2009" "2010" "2011" "2012" "2013" "2014"; do
for letter in {0..9} {A..Z}; do
mkdir -p ${DESTBASEDIR}/${year}/${letter}
mv ${SOURCEDIR}/123456789012_${letter}?_??_${year}????.dat ${DESTBASEDIR}/${year}/${letter}/
done
done
Betik tam olarak istediğimi yapıyor, ancak mv oraya taşınacak bir dosya bulamazsa bile hedef klasörler yaratıyor. Mkdir kullanarak oluşturmak yerine gerekli yöneticileri oluşturma seçeneğine sahip bir mv istiyorum.
Taşınacak bir dosya olmadığında bu betiğin hataları göstereceğini biliyorum. Komut tamamlandığında hata mesajlarını bastırırım.
Boş dizinler oluşturmadan anında dizin yapısını oluşturmanın kolay ve zarif bir yolu var mı?
Yardımın için teşekkürler!
Saygılarımızla
Manuel
Glenn jackman'ın sürümü bana hile yapan aşağıdaki komut dosyalarına ilham verdi :)
#!/bin/bash
declare -r SOURCEDIR=/some/dir/upload
declare -r DESTBASEDIR=/some/dir/archive
cd "$SOURCEDIR"
for f in 1234567890_* ; do
letter=${f:11:1}
year=${f:21:4}
dest="$DESTBASEDIR/$year/$letter"
mkdir -p "$dest"
mv "$f" "$dest"
done
Dosya adı içindeki ofsetlerin öğrendiğimden bu yana taşındığını, dosya adının başındaki baş sayısının daha kısa olduğunu unutmayın. Verilen çözüm benim yanlış örneğim üzerine tasarlandı.
Bu yaklaşım, kaynak dizindeki dosyaların dosya adlarının söylendiği gibi olup olmadığını kontrol etmediğinden daha az güvenlidir. Bu durumda, buna güvenebilirim, bu yüzden bunu doğrulayarak fazla risk almıyorum.
Glenn jackman'ın sürümünde verilen satır
for f in 123456789012_[A-Z]?_??_[0-9][0-9][0-9][0-9]????.dat ; do
işe yaramadı. "İn" den sonra gelen değer, bash üzerinde hazır bilgi dizgesi olarak yorumlandı. Bunun nasıl tamir edileceğini bilmiyorum.