2012-10-26 8 views
6

Yardımlarınız için şimdiden teşekkür ederiz!Bash - bir dizindeki her klasör için for döngüsü, bunlardan bazıları hariç

for d in this_folder/*  
    do  
     plugin=$(basename $d) 
     echo $plugin'?' 
     read $plugin 
    done 

bir cazibe gibi çalışır:

ben bash bu kodu var. 'This_folder' içindeki her klasör için, bir soru olarak yankılanın ve girdiyi aynı ada sahip bir değişkene kaydedin.

Ancak şimdi bazı klasörleri hariç tutmak istiyorum, örneğin, bu dizindeki tüm klasörleri SADECE aşağıdaki klasörlerden OLMADIĞINI soracak: global, plugins ve css.

Herhangi bir fikri nasıl başarabilirim?

Teşekkürler!

GÜNCELLEME: Bir değişkende sonucunu saklamak ardından dizinleri listesi oluşturmak için find ve awk kullanıp,

base="coordfinder|editor_and_options|global|gyro|movecamera|orientation|sa" 

> vt_conf.sh 
echo "# ========== Base"  >> vt_conf.sh 
for d in $orig_include/@($base) 
do 
    plugin=$(basename $d) 
    echo "$plugin=y"   >> vt_conf.sh 
done 
echo ''      >> vt_conf.sh 
echo "# ========== Optional" >> vt_conf.sh 
for d in $orig_include/!($base) 
do 
    plugin=$(basename $d) 
    echo "$plugin=n"   >> vt_conf.sh 
done 

cevap

6

Eğer Bash son sürümlerinden varsa, kullanabilirsiniz genişletilmiş globs (shopt -s extglob):

for d in this_folder/!(global|plugins|css)/ 
do  
    plugin=$(basename "$d") 
    echo $plugin'?' 
    read $plugin 
done 
+0

Bu çok iyi bir seçenektir, ancak "this_folder" dosyasında hem dizinler hem de dosyalar varsa tüm dosyaları da döndürür. Eğer 'for' satırının sonuna bir '/' işareti koyduysanız ('!' Kriterlerinden sonra), bu güzel çalışacaktır. Ayrıca, teklifler arasında "$ d" ifadelerini çevreleyen (size ve OP'ye) öneririm, böylece bu dosya boşluklarını boşluklarla kaplayabilir. –

+1

@CharlesRobertoCanato: İyi tavsiye, önerilerinizi ekledim – Thor

-1

:

Bu gibi nihai kod böyle görünüyor. Bu çizgisinde bir şey (denenmemiş):

dirs=$(find this_folder -maxdepth 1 -type d -printf "%f\n" | awk '!match($0,/^(global|plugins|css)$/)') 
for d in $dirs; do 
    # ... 
done 
+0

maç boşluk veya kabuk joker karakterler içeren dosya adları yoksa, bu kıracak varolan dosya. – tripleee

7

Sen döngü bir kez yinelenir atlamak için continue kullanabilirsiniz: Eğer küresel, css adlı sadece dizinleri hariç amaçladıysanız

for d in this_folder/*  
    do  
     plugin=$(basename $d) 
     [[ $plugin =~ ^(global|plugins|css)$ ]] && continue 
     echo $plugin'?' 
     read $plugin 
    done 
1

, eklentileri . Bu zarif bir çözüm olmayabilir ama istediğinizi yapacağız.

for d in this_folder/*  
do 
    flag=1 
    #scan through the path if it contains that string 
    for i in "/css/" "/plugins/" "/global/" 
    do 

    if [[ $(echo "$d"|grep "$i") && $? -eq 0 ]] 
    then 
     flag=0;break; 
    fi 
    done 

    #Only if the directory path does NOT contain those strings proceed 
    if [[ $flag -eq 0 ]] 
    then 
    plugin=$(basename $d) 
    echo $plugin'?' 
    read $plugin 
    fi 


done 
+1

'flag = 0; break' 'yerine' 2'yi kullanmaya devam edebilirsiniz. Daha sonra, daha sonra, [[$ flag -eq 0]] ... 'wrapper 'i siliniz. – dubiousjim

+0

@dubiousjim: haklısın, ama ben sadece OP için anlamak için betiği daha basit hale getirmek istedim. – askmish

İlgili konular