grep का उपयोग -r
विकल्प का उपयोग करके पुनरावर्ती रूप से खोजने की क्षमता है। हालांकि, मैं सोच रहा था कि grep में एक निश्चित संख्या में सबफ़ोल्डर स्तर के लिए क्वेरी स्ट्रिंग को खोजने की क्षमता है या नहीं। उदाहरण के लिए, मेरे पास एक फ़ोल्डर root
है जिसमें फ़ोल्डर्स parent1, parent2, ..., parentN
हैं। प्रत्येक अभिभावक फ़ोल्डर में सामान्य टेक्स्ट फ़ाइलें और फ़ोल्डर्स होते हैं जिन्हें child1, child2, ..., childM
कहा जाता है। मैं रूट स्तर से grep को चलाने और बाल फ़ोल्डरों को देखे बिना माता-पिता के अंदर फ़ाइलों में खोजना चाहता हूं। क्या ऐसा करने के लिए एक सरल तरीका है?grep recursively
उत्तर
आप इन बाहर की कोशिश कर सकते हैं:
ग्रेप:
--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'
...
ध्यान दें कि उपर्युक्त सभी उदाहरण कुशल नहीं हैं। वे सिर्फ उदाहरण हैं।
त्वरित उत्तर के लिए धन्यवाद। क्या आप समझा सकते हैं कि | आपके उदाहरण में दर्शाता है। मुझे पता है कि इसका उपयोग एक पावर आउटपुट को एक dest के लिए किया जा सकता है, लेकिन मुझे समझ में नहीं आता कि आउटपुट को एक अलग कमांड पर पाइप करने के लिए कैसे समझ में आता है। किसी भी घटना में, मैं आपका समाधान आजमा रहा हूं और जल्द ही आपका जवाब स्वीकार करूंगा। – Sal
@ सल जवाब, अधिक पाइप में संपादित देखें – Kent
Kentnotes के रूप में, आप सीधे grep
के साथ ऐसा नहीं कर सकते हैं; यह बस पर्याप्त शक्तिशाली नहीं है। चाल find
का उपयोग करने के लिए है कि कौन सी फाइलें खोज करें, और फ़ाइल सूची को पास करें find
grep
पर उत्पादित करता है।
आप 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 पर प्राप्त जोड़ने के बाद है। परिणाम यह है कि grep
find
पाये जाने वाली प्रत्येक फ़ाइल को खोजेगा।
यह काम नहीं करता है अगर आपके कुछ फ़ाइल नामों में रिक्त स्थान हैं, हालांकि xargs
सोचता है कि स्थान एक फ़ाइल नाम के भाग के बजाय दो अलग-अलग फ़ाइल नामों को अलग कर रहा है। इसे संभालने के तरीकों का एक समूह है (आदर्श है कि फ़ाइल नामों में रिक्त स्थान का उपयोग न करें), और आम तौर पर find
की प्रशंसक सुविधाओं में से एक का उपयोग करना है।
आप find
के लिए एक -exec
तर्क जोड़ेंगे, तो वह सब कुछ निष्पादित करेंगे आप एक ;
या +
अप करने के लिए निर्दिष्ट करें। यदि आप {}
जोड़ते हैं (यह शाब्दिक वर्ण {
और }
है), तो यह सभी फ़ाइलों की सूची के साथ प्रतिस्थापित करेगा। चूंकि find
ऐसा कर रहा है, यह जानता है कि फ़ाइल नाम में रिक्त स्थान फ़ाइल नाम में होना चाहिए।
इसलिए कि तुम क्या करने की कोशिश कर रहे हैं करने के लिए सबसे अच्छा तरीका है इस प्रकार है:
find . -type f -maxdepth 2 -exec grep <text-to-search-for> {} +
(+
और ;
के साथ समाप्त होने के बीच का अंतर यहाँ कोई फर्क नहीं पड़ता कि आप रुचि रखते हैं, यह man find
में है, लेकिन। लघु संस्करण है कि +
तेजी से होता है, लेकिन अर्थ है कि आप केवल आदेश में एक {}
हो सकता है)
- 1. Intellij recursively nesting आउटपुट निर्देशिका
- 2. grep
- 3. grep
- 4. grep
- 5. grep
- 6. grep
- 7. grep
- 8. grep
- 9. grep
- 10. grep
- 11. grep
- 12. grep -
- 13. grep
- 14. 'grep'
- 15. grep
- 16. grep
- 17. grep
- 18. grep बनाम बिल्ली और grep
- 19. grep, उदा। जीसीसी | colorgcc | grep regexp
- 20. grep पथ/फ़ाइल दिखाए बिना grep: लाइन
- 21. Grep Regex:
- 22. ack-grep:
- 23. Grep जावास्क्रिप्ट
- 24. Grep 'बाइनरी फ़ाइल मिलान'। सामान्य grep आउटपुट कैसे प्राप्त करें?
- 25. केवल लाइन नंबर के लिए फास्ट grep/grep?
- 26. Grep रिकर्सिव और
- 27. सरल TextWrangler Grep बदलें
- 28. grep सभी निर्देशिकाओं में
- 29. grep egrep एकाधिक-स्ट्रिंग्स
- 30. git grep - लेकिन सूचकांक
आप की तरह कुछ करना चाहता हूँ:। लगता है/path// लगता है -name "nameofthefile" या बिल्ली प्रत्येक फाइल करने के लिए करना चाहते हैं एक स्ट्रिंग के लिए जाँच करें? –