आप ग्लोबस्टार का उपयोग भी कर सकते हैं।
Zanna के उत्तर मेंgrepfind , जैसा कि एक अत्यधिक मजबूत, बहुमुखी और पोर्टेबल तरीका है, ऐसा करने के लिए बिल्डिंग कमांड्स (यह भी सुडोडस का उत्तर देखें )। और muru का उपयोग करने का एक उत्कृष्ट दृष्टिकोण पोस्ट किया गया है grepके --includeविकल्प । लेकिन अगर आप केवल grepकमांड और अपने शेल का उपयोग करना चाहते हैं , तो ऐसा करने का एक और तरीका है - आप शेल को स्वयं आवश्यक प्रतिरूपण करने के लिए बना सकते हैं :
shopt -s globstar # you can skip this if you already have globstar turned on
grep -H 'pattern' **/file.txt
-Hझंडा बनाता है grepफ़ाइल नाम भले ही केवल एक मिलान फ़ाइल पाया जाता है दिखाते हैं। आप पास कर सकते हैं -a, -iऔर -nकरने के लिए झंडे (अपने उदाहरण से) grepके रूप में अच्छी तरह से, अगर है कि तुम क्या जरूरत है। लेकिन इस विधि का उपयोग करते समय -rया पास न -Rकरें। यह वह शेल है जो ग्लोब पैटर्न युक्त विस्तार में निर्देशिकाओं की पुनरावृत्ति करता है **, और नहींgrep ।
ये निर्देश बैश शेल के लिए विशिष्ट हैं। बश उबंटू (और अधिकांश अन्य GNU / लिनक्स ऑपरेटिंग सिस्टम) में डिफ़ॉल्ट उपयोगकर्ता शेल है, इसलिए यदि आप उबंटू में हैं और आपको नहीं पता कि आपका शेल क्या है, तो यह लगभग निश्चित रूप से बैश है। हालांकि लोकप्रिय गोले आमतौर पर निर्देशिका-ट्रैवर्सिंग **ग्लब्स का समर्थन करते हैं, वे हमेशा उसी तरह से काम नहीं करते हैं। अधिक जानकारी के लिए, स्टीफन Chazelas के उत्कृष्ट जवाब करने के लिए ls का परिणाम *, एलएस ** और ls *** पर Unix.SE ।
यह काम किस प्रकार करता है
चालू किया जा रहा globstar बैश खोल विकल्प बनाता **मैच निर्देशिका विभाजक युक्त पथ ( /)। यह इस प्रकार एक निर्देशिका-आवर्ती ग्लोब है। विशेष रूप से, जैसा man bashकि स्पष्ट है:
जब ग्लोबस्टार शेल विकल्प सक्षम होता है, और * एक पाथनेम विस्तार के संदर्भ में उपयोग किया जाता है, तो एक पैटर्न के रूप में उपयोग किए जाने वाले दो आसन्न * सभी फाइलों और शून्य या अधिक निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएंगे। यदि a / द्वारा अनुसरण किया जाता है, तो दो निकटवर्ती * s केवल निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएंगे।
आपको इससे सावधान रहना चाहिए, क्योंकि आप कमांड को चला सकते हैं जो आपके द्वारा इरादा किए जाने की तुलना में कहीं अधिक फ़ाइलों को संशोधित या हटाता है, खासकर यदि आप लिखते हैं, **जब आप लिखना चाहते थे *। (यह इस आदेश में सुरक्षित है, जो किसी भी iles को नहीं बदलता है।) shopt -u globstarग्लोबस्टार शेल विकल्प को बंद कर देता है।
ग्लोबस्टार और के बीच कुछ व्यावहारिक अंतर हैं find।
findग्लोबस्टार की तुलना में कहीं अधिक बहुमुखी है। ग्लोबस्टार के साथ आप कुछ भी कर सकते हैं, आप findकमांड के साथ भी कर सकते हैं । मुझे ग्लोबस्टार पसंद है, और कभी-कभी यह अधिक सुविधाजनक होता है, लेकिन ग्लोबस्टार इसका सामान्य विकल्प नहीं है find।
उपरोक्त विधि उन निर्देशिकाओं के अंदर नहीं दिखती है जिनके नाम a से शुरू होते हैं .। कभी-कभी आप ऐसे फ़ोल्डरों को दोबारा प्राप्त नहीं करना चाहते हैं, लेकिन कभी-कभी आप ऐसा करते हैं।
एक साधारण ग्लोब की तरह, शेल सभी मिलान पथों की एक सूची बनाता है और उन्हें grepग्लोब के स्थान पर आपके कमांड ( ) में तर्क के रूप में पास करता है। यदि आपके पास बहुत सारी फाइलें हैं, तो file.txtपरिणामी कमांड सिस्टम को निष्पादित करने के लिए बहुत लंबा होगा, फिर ऊपर की विधि विफल हो जाएगी। व्यवहार में आपको ऐसी कम से कम हजारों फ़ाइलों की आवश्यकता होगी, लेकिन ऐसा हो सकता है।
उपयोग करने के तरीके findइस प्रतिबंध के अधीन नहीं हैं, क्योंकि:
ज़ाना का रास्ताgrep संभावित रूप से कई पथ तर्कों के साथ एक कमांड बनाता है और चलाता है । लेकिन अगर एक से अधिक फ़ाइलों को एक ही पथ में सूचीबद्ध किया जा सकता है, तो +-terminated -execकार्रवाई कुछ रास्तों के साथ कमांड चलाती है, फिर कुछ और पथों के साथ इसे फिर से चलाता है, और इसी तरह आगे। grepकई फ़ाइलों में एक स्ट्रिंग के लिए आईएनजी के मामले में , यह सही व्यवहार पैदा करता है।
यहां कवर किए गए ग्लोबस्टार विधि की तरह, यह सभी मिलान लाइनों को प्रिंट करता है, प्रत्येक के लिए पथों के साथ।
सूडोडस का तरीकाgrep प्रत्येक file.txtपाया के लिए अलग-अलग चलता है। यदि कई फाइलें हैं, तो यह कुछ अन्य तरीकों से धीमी हो सकती है, लेकिन यह काम करती है।
यह विधि फाइलों को ढूंढती है और उनके रास्तों को प्रिंट करती है, इसके बाद यदि कोई हो तो लाइनों को मिलाएं। यह मेरी विधि, ज़न्ना और मुरु द्वारा निर्मित प्रारूप से एक अलग आउटपुट स्वरूप है ।
के साथ रंग हो रहा है find
ग्लोबस्टार का उपयोग करने के तत्काल लाभों में से एक, उबंटू पर डिफ़ॉल्ट रूप से है, grepरंगीन उत्पादन का उत्पादन करेगा। लेकिन आप आसानी से इस के साथ प्राप्त कर सकते हैं find, भी ।
उबंटू में उपयोगकर्ता खाते एक उपनाम के साथ बनाए जाते हैं जो grepवास्तव में चलता है grep --color=auto( alias grepदेखने के लिए रन )। यह एक अच्छी बात है कि एलियासेस बहुत ही विस्तारित हैं जब आप उन्हें अंतःक्रियात्मक रूप से जारी करते हैं , लेकिन इसका मतलब है कि यदि आप ध्वज के साथ findआह्वान करना चाहते हैं , तो आपको इसे स्पष्ट रूप से लिखना होगा। उदाहरण के लिए:grep--color
find . -name file.txt -exec grep --color=auto -H 'pattern' {} +