2012-10-26 21 views
6

मदद के लिए बहुत पहले धन्यवाद!निर्देशिका में प्रत्येक फ़ोल्डर के लिए बैश-फॉर-लूप, उनमें से कुछ को छोड़कर

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

जो एक आकर्षण की तरह काम करता है:

मैं पार्टी में इस कोड की है। 'This_folder' के अंदर प्रत्येक फ़ोल्डर के लिए, इसे एक प्रश्न के रूप में गूंजें और उसी नाम के साथ इनपुट को एक चर में संग्रहीत करें।

लेकिन अब मैं कुछ फ़ोल्डरों को बाहर करना चाहता हूं, उदाहरण के लिए, यह उस निर्देशिका में प्रत्येक फ़ोल्डर के लिए पूछेगा, केवल तभी यदि वे निम्न में से कोई भी फ़ोल्डर नहीं हैं: वैश्विक, प्लगइन्स और सीएसएस।

कोई विचार मैं इसे कैसे प्राप्त कर सकता हूं?

धन्यवाद!

अद्यतन:

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 

उत्तर

6

विस्तारित globs आप बैश का नवीनतम संस्करण है, तो आप उपयोग कर सकते हैं (shopt -s extglob):

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

यह एक बहुत अच्छा विकल्प है, लेकिन यदि यह 'this_folder' दोनों निर्देशिकाएं और फ़ाइलें हैं तो सभी फ़ाइलों को भी वापस कर देगा। यदि आप 'लाइन' के अंत में 'पीछे'/'डालते हैं' ('!' मानदंड के बाद), यह खूबसूरती से काम करेगा। इसके अलावा, मैं उद्धरण के बीच '$ d' के संदर्भ संलग्न करने के लिए (आप और ओपी) की सिफारिश करता हूं, इसलिए यह रिक्त स्थान के साथ फाइलस्पेक्स को कवर कर सकता है। –

+1

@ चार्ल्स रॉबर्टो कानाटो: अच्छी सलाह, मैंने आपके सुझाव जोड़े हैं – Thor

-1

आप find और awk इस्तेमाल कर सकते हैं निर्देशिका की सूची का निर्माण करने के लिए और फिर एक चर में परिणाम की दुकान:

इस तरह कैसे अंतिम कोड दिखता है। इस की तर्ज पर कुछ (untested):

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

यह अगर वहाँ फ़ाइल नाम जो खाली स्थान या खोल वाइल्डकार्ड वर्णों जो मेल खाने वाली हैं टूट जाएगा एक मौजूदा फ़ाइल। – tripleee

7

आप continue का उपयोग पाश में से एक यात्रा छोड़ कर सकते हैं:

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

आप केवल निर्देशिका वैश्विक, सीएसएस नामित को बाहर करने की है तो प्लगइन्स । यह एक सुरुचिपूर्ण समाधान नहीं हो सकता है लेकिन आप जो चाहते हैं वह करेंगे।

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

'ध्वज = 0; ब्रेक;' के बजाय आप केवल 'जारी रखें 2' का उपयोग कर सकते हैं। फिर बाद में 'अगर [[$ ध्वज-0 0]] हटाएं ...' रैपर। – dubiousjim

+0

@ dubiousjim: हाँ आप सही हैं, लेकिन मैं ओपी के लिए समझने के लिए स्क्रिप्ट को सरल बनाना चाहता था। – askmish