bash

2012-10-22 35 views
6

dosya dizini oluşturma ve hareket ben ilk kadar dosya adının ilk bölümünde dayalı dizinleri bir dizi oluşturmak istersiniz dosyalarıbash

BR0200.aaa.tsv 
BR0200.bbb.tsv 
BR0200.ccc.tsv 
BR0210.aaa.tsv 
BR0210.bbb.tsv 
BR0210.ccc.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 
W0210.aaa.tsv 

bir yük var. ''

BR0200 
BR210 
W0210 

ve ardından doğru dizinlere ilişkili dosya taşımak (yani tüm BR0200. * BR0200 dizinine dosyaları).

Bir bash komut dosyasında bir bıçak var ama hata almaya devam ediyorum. Herhangi bir tavsiye minnetle alınacaktır.

#!/bin/bash 

for file in BR* W0*; do 
dir = "${file%%.*}" 
if [-e $dir];then 
mv "$file" "$dir" 
else 
mkdir -p "$dir" 
mv "$file" "$dir" 
fi 
done 

Eğer bu temel bir soru ise üzgünüm. Web'de arama yapmayı denedim, ancak sonuç vermedi.

+0

@owlstead Ne demek istiyorsun? –

+0

@owlstead globbing, kabukların sunduğu en kullanışlı özelliklerden biridir. – jordanm

+0

@jordanm Yorumunuzu kaldırarak elbette haklısınız. –

cevap

6

Bir ödevde = çevresinde izin verilen boşluk yoktur.

dir="${file%%.*}" 

Tersine, boşluk bir testte gerekli olup. Eğer if açıklamada kurtulmak böylece

if [ -e $dir ]; then 
    ^ ^

Bildiğim kadarıyla üslup iyileşmeler olarak, bu gereksiz bir mkdir -p yapmak zarar vermez.

Bir ödevde tırnaklar gerekli değildir, bu nedenle bunları dir= satırından kaldırabilirsiniz. Teklif vermek her yerde başka bir fikir olsa da, diğer alıntıları silmeyin.

Döngü için fazladan bir .* eklemek iyi olabilir. Bu şekilde, komut dosyasını bir kereden fazla çalıştırırsanız, yeni oluşturulan alt dizinleri taşımayı denemezsiniz. Ve düzgün bir hile (mutlaka bir iyileştirme olmasa da), BR*.* W0*.*'u {BR,W0}*.*'a kısaltmaktır.

for file in {BR,W0}*.*; do 
    dir=${file%%.*} 
    mkdir -p "$dir" 
    mv "$file" "$dir" 
done 
0

Böyle bir şey deneyebilirsiniz:

BR * dosya için WO *; dir = $ do ($ {dosya} echo |.. Awk -F OFS = '{print $ 1}')

yapılan mkdir $ dir mv $ dosya $ dir Ben benzer bir durum vardı ve bu çalıştı benim için.