हालांकि find
कमांड का उपयोग करना यहां उपयोगी हो सकता है, शेल खुद को बिना किसी तीसरे पक्ष के उपकरण के इस आवश्यकता को प्राप्त करने के लिए विकल्प प्रदान करता है। bash
खोल जो आप पुनरावर्ती पथ के तहत फ़ाइल नाम प्राप्त कर सकते हैं का उपयोग कर एक विस्तारित ग्लोब समर्थन विकल्प प्रदान करता है कि एक्सटेंशन आप चाहते हैं के साथ मैच।
विस्तारित विकल्प extglob
जो shopt
नीचे दिए गए विकल्प का उपयोग करके सेट किया जाना है । विकल्प -s
समर्थन के साथ सक्षम हैं और वह -u
ध्वज के साथ अक्षम है । इसके अतिरिक्त आप कुछ और विकल्पों का उपयोग कर सकते हैं nullglob
जिनमें एक बेजोड़ गोला पूरी तरह से बह गया है, जिसे शून्य शब्दों के एक सेट के साथ बदल दिया गया है। और globstar
वह सभी निर्देशिकाओं के माध्यम से पुनरावृत्ति करने की अनुमति देता है
shopt -s extglob nullglob globstar
अब आपको बस इतना करना है कि एक निश्चित एक्सटेंशन की फाइलों को शामिल करने के लिए ग्लोब एक्सप्रेशन बनाएं जो आप नीचे बता सकते हैं। हम ग्लोब परिणामों को पॉप्युलेट करने के लिए एक सरणी का उपयोग करते हैं क्योंकि जब ठीक से उद्धृत और विस्तारित किया जाता है, तो विशेष वर्ण वाले फ़ाइल नाम बरकरार रहेंगे और शेल द्वारा शब्द-विभाजन के कारण टूट नहीं जाएंगे।
उदाहरण के लिए *.csv
पुनरावर्ती रास्तों की सभी फाइलों को सूचीबद्ध करना
fileList=(**/*.csv)
विकल्प **
उप-फ़ोल्डरों के माध्यम से पुनरावृत्ति करना है और *.csv
उल्लिखित एक्सटेंशन की किसी भी फ़ाइल को शामिल करने के लिए ग्लोब विस्तार है। अब वास्तविक फाइलों की छपाई के लिए, बस
printf '%s\n' "${fileList[@]}"
एक सरणी का उपयोग करना और एक उचित उद्धृत विस्तार करना, शेल स्क्रिप्ट में उपयोग किए जाने का सही तरीका है, लेकिन इंटरेक्टिव उपयोग के लिए, आप बस ls
ग्लोब अभिव्यक्ति के साथ उपयोग कर सकते हैं
ls -1 -- **/*.csv
यह बहुत अच्छी तरह से कई फ़ाइलों से मेल खाने के लिए विस्तारित किया जा सकता है यानी फ़ाइल कई एक्सटेंशन के साथ समाप्त होती है (यानी find
कमांड में कई झंडे जोड़ने के समान )। उदाहरण के लिए सभी पुनरावर्ती छवि फ़ाइलों को प्राप्त करने की आवश्यकता के एक मामले पर विचार करें *.gif
, अर्थात एक्सटेंशन , *.png
और *.jpg
, आपको बस इतना करना होगा
ls -1 -- **/+(*.jpg|*.gif|*.png)
यह बहुत अच्छी तरह से विस्तारित किया जा सकता है नकारात्मक परिणाम भी है। एक ही वाक्य रचना के साथ, कोई निश्चित प्रकार की फ़ाइलों को बाहर करने के लिए ग्लोब के परिणामों का उपयोग कर सकता है। मान लें कि आप ऊपर के एक्सटेंशन वाले फ़ाइल नामों को बाहर करना चाहते हैं, तो आप कर सकते हैं
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
निर्माण !()
एक नकारात्मक ऑपरेशन है, जिसमें किसी भी फ़ाइल एक्सटेंशन को सूचीबद्ध नहीं किया गया है और |
यह एक अल्टरनेशन ऑपरेटर है, जिसका उपयोग ग्लोब के OR मैच करने के लिए एक्सटेंडेड रेगुलर एक्सप्रेशंस लाइब्रेरी में किया जाता है।
ध्यान दें कि ये विस्तारित ग्लोब समर्थन POSIX बॉर्न शेल में उपलब्ध नहीं है और इसके विशुद्ध रूप से हाल के संस्करणों के लिए विशिष्ट है bash
। इसलिए यदि आप POSIX और bash
गोले भर में चल रही स्क्रिप्ट की पोर्टेबिलिटी पर विचार कर रहे हैं , तो यह विकल्प सही नहीं होगा।