2012-09-07 12 views
6
में च के लिए

इस सरल पाश पर विचार करें:सरल बैश - *

for f in *.{text,txt}; do echo $f; done 

मैं केवल वैध फ़ाइल नाम गूंज करना चाहते हैं। एक स्क्रिप्ट में $ f चर का उपयोग करना सब कुछ तब तक बढ़िया काम करता है जब तक कि उस एक्सटेंशन की कोई भी फाइल न हो।

*.text 
*.txt 

बजाय गूंज कुछ भी नहीं: एक खाली सेट के मामले में, $ f * .text और इसके बाद के संस्करण लाइन इको को तैयार है। यह एक त्रुटि बनाता है यदि आप किसी वास्तविक वास्तविक फ़ाइल नाम की अपेक्षा रखने वाले किसी भी चीज़ के लिए $ f का उपयोग करने का प्रयास कर रहे हैं और इसके बजाय * प्राप्त हो।

यदि वाइल्डकार्ड से मेल खाने वाली कोई भी फाइलें हैं तो यह एक खाली सेट नहीं है, जैसा कि मैं चाहता हूं। जैसे

123.text 
456.txt 
789.txt 

मैं त्रुटियों के बिना ऐसा कैसे कर सकता हूं और बिना किसी तार के लिए पहली स्ट्रिंग $ f मिलान की अत्यधिक जटिलता के बिना कैसे कर सकता हूं?

उत्तर

13

nullglob विकल्प का उपयोग करके इसके परिणाम आयन।

$ for f in *.foo ; do echo "$f" ; done 
*.foo 
$ shopt -s nullglob 
$ for f in *.foo ; do echo "$f" ; done 
$ 
+0

यह वही है जो मैं खोज रहा था। धन्यवाद! – user1610022

3

यदि फ़ाइल वास्तव में मौजूद परीक्षण कर सकते हैं:

for f in *.{text,txt}; do if [ -f $f ]; then echo $f; fi; done 

या आप find आदेश का उपयोग कर सकते हैं: इसके अलावा

for f in $(find -name '*.text' -o -name '*.txt'); do 
    echo $f 
done 
+0

परीक्षण अगर वास्तव में $ f वास्तव में पर्याप्त रूप से काम करता है तो परीक्षण। लेकिन, यह एक अतिरिक्त परीक्षण है जिसे मैंने टालने की आशा की थी। – user1610022

0

, यदि आप ls के बाहरी उपयोग के खर्च कर सकते हैं, तो आप बच सकते हैं

for f in `ls *.txt *.text`; 
+0

फ़ाइल नामों में रिक्त स्थान होने पर यह काम नहीं करता है। – choroba

+0

जिसे '$ IFS' सही तरीके से सेट करके तय किया जा सकता है। Nullglob विकल्प के विपरीत, यह दुकान के लिए बुलाए बिना एक शेल स्क्रिप्ट के अंदर काफी सुरक्षित रूप से हो सकता है। – ThePadawan

+0

कृपया दिखाएं कि कैसे। इसके अलावा, 'दुकान' एक बिल्टिन है, इसलिए आप इसे "आउट" नहीं कहते हैं। – choroba