2013-03-01 5 views
5

grep का उपयोग -r विकल्प का उपयोग करके पुनरावर्ती रूप से खोजने की क्षमता है। हालांकि, मैं सोच रहा था कि grep में एक निश्चित संख्या में सबफ़ोल्डर स्तर के लिए क्वेरी स्ट्रिंग को खोजने की क्षमता है या नहीं। उदाहरण के लिए, मेरे पास एक फ़ोल्डर root है जिसमें फ़ोल्डर्स parent1, parent2, ..., parentN हैं। प्रत्येक अभिभावक फ़ोल्डर में सामान्य टेक्स्ट फ़ाइलें और फ़ोल्डर्स होते हैं जिन्हें child1, child2, ..., childM कहा जाता है। मैं रूट स्तर से grep को चलाने और बाल फ़ोल्डरों को देखे बिना माता-पिता के अंदर फ़ाइलों में खोजना चाहता हूं। क्या ऐसा करने के लिए एक सरल तरीका है?grep recursively

+1

आप की तरह कुछ करना चाहता हूँ:। लगता है/path// लगता है -name "nameofthefile" या बिल्ली प्रत्येक फाइल करने के लिए करना चाहते हैं एक स्ट्रिंग के लिए जाँच करें? –

उत्तर

6

आप इन बाहर की कोशिश कर सकते हैं:

ग्रेप:

--exclude=GLOB 
       Skip files whose base name matches GLOB (using 
       wildcard matching). A file-name glob can use *, 
       ?, and [...] as wildcards, and \ to quote a wildcard 
       or backslash character literally. 

     --exclude-from=FILE 
       Skip files whose base name matches any of the file-name 
       globs read from FILE (using wildcard matching as 
       described under --exclude). 

     --exclude-dir=DIR 
       Exclude directories matching the pattern DIR from 
       recursive searches. 

या इस find | xargs grep

खोजने के साथ

उपयोग करते हैं, आप स्तर निर्धारित कर सकते हैं

संपादित

एक आदेश के दूसरे भाग में पाइप आउटपुट लिनक्स/यूनिक्स दुनिया में बहुत आम है। मुझे यकीन है कि आप इसे हर रोज करते हैं।

echo "abc"|sed 's/a/x/' 
find . -name "*.pyc" |xargs rm 
awk 'blahblah' file | sort |head -n2 
tree|grep 'foo' 
mvn compile|ack 'error' 
... 

ध्यान दें कि उपर्युक्त सभी उदाहरण कुशल नहीं हैं। वे सिर्फ उदाहरण हैं।

+0

त्वरित उत्तर के लिए धन्यवाद। क्या आप समझा सकते हैं कि | आपके उदाहरण में दर्शाता है। मुझे पता है कि इसका उपयोग एक पावर आउटपुट को एक dest के लिए किया जा सकता है, लेकिन मुझे समझ में नहीं आता कि आउटपुट को एक अलग कमांड पर पाइप करने के लिए कैसे समझ में आता है। किसी भी घटना में, मैं आपका समाधान आजमा रहा हूं और जल्द ही आपका जवाब स्वीकार करूंगा। – Sal

+0

@ सल जवाब, अधिक पाइप में संपादित देखें – Kent

10

Kentnotes के रूप में, आप सीधे grep के साथ ऐसा नहीं कर सकते हैं; यह बस पर्याप्त शक्तिशाली नहीं है। चाल find का उपयोग करने के लिए है कि कौन सी फाइलें खोज करें, और फ़ाइल सूची को पास करें findgrep पर उत्पादित करता है।

आप man find चलाते हैं, तो आप कई विकल्पों find लेता है का एक आदमी पृष्ठ मिलेगा। जिसकी हम यहां रुचि रखते हैं वह -maxdepth है।

चलो हम जिस आदेश की आवश्यकता है उसका निर्माण करते हैं। प्रत्येक चरण में कमांड चलाने कि यह दिखता देखने के लिए:

  • find . सभी फ़ाइलों और फ़ोल्डरों कि वर्तमान फ़ोल्डर (.) या किसी वंशज फ़ोल्डर में मौजूद सूची जाएगा।

  • find . -maxdepth 1 वर्तमान फ़ोल्डर में सभी फ़ाइलों और फ़ोल्डरों को सूचीबद्ध करेगा। find . -maxdepth 2 इसी प्रकार मौजूदा फ़ोल्डर और किसी भी तत्काल सबफ़ोल्डर में सभी फ़ाइलों और फ़ोल्डर्स के लिए सूचीबद्ध होगा। और आगे ...

  • ध्यान दें कि हमें फ़ोल्डरों को भी सूचीबद्ध किया जा रहा है; हम यह नहीं चाहते हैं, grep फ़ोल्डर को ही नहीं खोज सकता, केवल फ़ोल्डर में फाइलें। केवल -type f जोड़ें फ़ाइलों को सूचीबद्ध करने के लिए: find . -maxdepth 2 -type f

अब हम फ़ाइलों हम खोज करना चाहते हैं पता है, हम उन फ़ाइलों को खोज करने के लिए grep प्राप्त करने की आवश्यकता।यह करने के लिए मानक तरीका xargs उपयोग कर रहा है:

find . -maxdepth 2 -type f | xargs grep <text-to-search-for> 

| "मानक आउटपुट", उर्फ ​​"stdout", find से (यानी क्या आप सामान्य रूप से स्क्रीन पर देखें) और पाइप यह xarg के "मानक में ले जाता है इनपुट ", उर्फ" stdin ", यानी सामान्य रूप से क्या होगा यदि आप एक चल रहे प्रोग्राम में टाइप कर रहे थे।

xargs एक चालाक थोड़ा कार्यक्रम चलाता है कि जो कुछ भी आप, (यहाँ, grep <text-to-search-for>) करने के लिए कह सभी तर्क यह stdin पर प्राप्त जोड़ने के बाद है। परिणाम यह है कि grepfind पाये जाने वाली प्रत्येक फ़ाइल को खोजेगा।

यह काम नहीं करता है अगर आपके कुछ फ़ाइल नामों में रिक्त स्थान हैं, हालांकि xargs सोचता है कि स्थान एक फ़ाइल नाम के भाग के बजाय दो अलग-अलग फ़ाइल नामों को अलग कर रहा है। इसे संभालने के तरीकों का एक समूह है (आदर्श है कि फ़ाइल नामों में रिक्त स्थान का उपयोग न करें), और आम तौर पर find की प्रशंसक सुविधाओं में से एक का उपयोग करना है।

आप find के लिए एक -exec तर्क जोड़ेंगे, तो वह सब कुछ निष्पादित करेंगे आप एक ; या + अप करने के लिए निर्दिष्ट करें। यदि आप {} जोड़ते हैं (यह शाब्दिक वर्ण { और } है), तो यह सभी फ़ाइलों की सूची के साथ प्रतिस्थापित करेगा। चूंकि find ऐसा कर रहा है, यह जानता है कि फ़ाइल नाम में रिक्त स्थान फ़ाइल नाम में होना चाहिए।

इसलिए कि तुम क्या करने की कोशिश कर रहे हैं करने के लिए सबसे अच्छा तरीका है इस प्रकार है:

find . -type f -maxdepth 2 -exec grep <text-to-search-for> {} + 

(+ और ; के साथ समाप्त होने के बीच का अंतर यहाँ कोई फर्क नहीं पड़ता कि आप रुचि रखते हैं, यह man find में है, लेकिन। लघु संस्करण है कि + तेजी से होता है, लेकिन अर्थ है कि आप केवल आदेश में एक {} हो सकता है)