2015-04-28 34 views
6

farklı görüntüler böyle bir klasör yapısı ile, dosya isimleri paylaşımı ile birkaç klasör vardır:Kabuk komut

/parent/folder001/img001.jpg 
/parent/folder001/img002.jpg 
/parent/folder002/img001.jpg 
/parent/folder002/img002.jpg 
/parent/folder003/img001.jpg 
/parent/folder003/img002.jpg 
... 

ve bu dosyaları yeniden adlandırmak/kopyalamak istiyoruz böyle yeni bir klasöre, içine:

/newfolder/folder001_img001.jpg 
/newfolder/folder001_img002.jpg 
/newfolder/folder002_img001.jpg 
/newfolder/folder002_img002.jpg 
/newfolder/folder003_img001.jpg 
/newfolder/folder003_img002.jpg 
... 

(newfolder ebeveynin bir alt değilse bu gerçekten garip özyinelemeye neden sonunda olabilir, çünkü muhtemelen daha iyidir.)

Resimler içeren klasörlerin hiçbiri alt klasör içermiyor.

İdeal olarak, komut dosyasını "daha sonra" yeni klasöre "güncelleştirmek" için kullanabilmeyi isterim, çünkü daha sonra klasör içeren görüntüler eklemek istiyorum.

Bunu bir kabuk komut dosyasıyla nasıl yapabilirim?

+0

Eh, elle hepsini yeniden adlandırma yüzlerce var, gerçekten bir seçenek değildir. Korkarım ki, kabuğa henüz kendimden bahsetmiyorum, ancak çözümler aramak, sadece farklı problemler/dizin yapıları için sonuçlara yöneldi. – Nekkowe

+0

Kaynak klasörün girişini (bu durumda "/ parent /") ve hedef klasörünü (bu durumda "/ newfolder") alır mı, daha sonra hedef klasöre birleştirmek için kaynak klasör içindeki tüm klasörleri yakalar mı? –

+0

Kaynak klasör içindeki klasörlerdeki dosyaları buna göre değiştirirken, evet. Çok yardımı dokunur! Komut dosyası ana klasörün içinde çalışıyor ve görüntü klasörlerini ana klasörle aynı dizinde bulunan bir klasörde birleştiriyorsa yeterli olabilir mi? – Nekkowe

cevap

3

yapacağız:

#!/bin/bash 
parent=/parent 
newfolder=/newfolder 
mkdir "$newfolder" 
for folder in "$parent"/*; do 
    if [[ -d "$folder" ]]; then 
    foldername="${folder##*/}" 
    for file in "$parent"/"$foldername"/*; do 
     filename="${file##*/}" 
     newfilename="$foldername"_"$filename" 
     cp "$file" "$newfolder"/"$newfilename" 
    done 
    fi 
done 
newfolder değişkene parent değişken ve Newfolder yolu ile ebeveyn yolunu koyun.Jahid senaryosunu güncellenmesi kurtarmaya

+1

Küre sonuçlarını, beyaz alan güvenliğini kaldıran skaler değişkenlerde saklamayın. Sadece onları doğrudan kullanın - '/ parent/* içindeki klasör için' ' – Kevin

+0

Cevabınız için teşekkür ederiz! Ne yazık ki, yeni klasörü yeni oluştururken, henüz dosyalar üzerinde kopyalama yapmıyor. Çıktı, aşağıdaki gibi bir şey verir: ebeveyndeki her klasör için 'cp: dizini atlamama'/parent/folder001’'. – Nekkowe

+0

İpucu için teşekkürler, @Kevin, @ Nekkowe, bu düzenlenmiş kodu tekrar deneyin. – Jahid

2

böyle bir şey kullanır: son / ile değiştirin

  • dosya adı
  • olsun: Bu akım dizin yapısı içinde dosyaları arar

    find -type f -exec sh -c 'f={}; fnew=$(rev <<< "$f" | sed 's~/~_~' | rev); echo "mv $f $fnew"' \; 
    

    ve aşağıdaki gerçekleştirmek _. Bu çalıştırmak ve uygun komutu yazdırır gördük kez

  • echo "cp $old_file $new_file"

yazma, etkili mv komutu yapar, böylece echo kaldırın.

Ben fnew=$(rev <<< "$f" | sed 's~/~_~' | rev) biraz çirkin hile biliyorum ama _ ile son / yerine daha iyi bir yol bulamadık. Belki sed -r 's~/([^/]*)$~_\1~' da uygun olanı olabilir, ama her zaman en bunun için bir while döngü kullanalım, -sh c ifadesiyle de davranmaz senin find yana rev :)


kullanmak gibi:

while read -r file 
do 
    new_file=$(rev <<< "$file" | sed 's~/~_~' | rev) 
    echo "mv $file $new_file"; done < <(find . -type f) 
done < <(find . -type f) 

Farklı bir tek satırlık: Bu biraz sıkıcı ama

while read -r file; do new_file=$(rev <<< "$file" | sed 's~/~_~' | rev); echo "mv $file $new_file"; done < <(find . -type f) 
+0

Oh, uh, şimdiye kadar verilmiş görünen tek çıktı: ' sh: 1: Sözdizimi hatası: yönlendirme beklenmedik '... bir çok satırda tekrarlandı (bir noktada sonlanır). Aynı sonuçları hem ebeveyn hem de alt klasörde çalıştırmayı denedim. – Nekkowe

+0

Hangi makineyi kullanıyorsunuz? Bu 'GNU 4.5.11' bulmak için iyi çalışıyor. Bu sana da mı çalışıyor? -> '-tipi bul f -exec sh -c 'f = {}; echo "$ f" '\; '. – fedorqui

+0

Bu, her birinde tek bir '$' ile çok sayıda satır çıkarır. – Nekkowe

2

fonksiyonları,: Kullanılan

function updateFolder 
{ 
    mkdir "$2" 
    for folder in "$1"/*; do 
    if [[ -d $folder ]]; then 
     foldername="${folder##*/}" 
     for file in "$1"/"$foldername"/*; do 
      filename="${file##*/}" 
      newfilename="$foldername"_"$filename" 
      cp "$file" "$2"/"$newfilename" 
     done 
    fi 
    done 
} 

:

$ updateFolder /parent /newfolder