Bash'ta joker karakterlerle mv kullanırken dinamik olarak hedef dizin yapısı nasıl oluşturulur?


1

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.

Yanıtlar:


1

Bu sadece dosya isimlerinde kullanılan yıl / harf dizinlerini yaratacaktır.

cd "$SOURCEDIR"
for f in 123456789012_[A-Z]?_??_[0-9][0-9][0-9][0-9]????.dat ; do
    letter=${f:13:1}
    year=${f:19:4}
    dest="$DESTBASEDIR/$year/$letter"
    mkdir -p "$dest"
    mv "$f" "$dest"
done

Bu kullanarak unutmayın ${braces} kullanarak aynı değil "$quotes" değişkenin değeri boşluk içeriyorsa


Teşekkür ederim! Bu ilginç bir yaklaşım :) Ama: Hile yapmaz. "{{0..9} {A..Z}; harfindeki harf için" harfini yazdığın haneyi unuttun ve nasıl sürümüne ekleyeceğinden emin değilim.
Manuel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.