मैं .gzसभी निर्देशिकाओं और उपनिर्देशिकाओं में सभी फ़ाइलों के माध्यम से एक स्ट्रिंग के लिए कैसे प्राप्त करूं ?
मैं .gzसभी निर्देशिकाओं और उपनिर्देशिकाओं में सभी फ़ाइलों के माध्यम से एक स्ट्रिंग के लिए कैसे प्राप्त करूं ?
जवाबों:
@Steve Weet लगभग वहीं है। अतिरिक्त तर्क के रूप में / dev / null का उपयोग फ़ाइल नाम को दिखाने के लिए बाध्य करने का एक अच्छा तरीका है (मुझे यह याद होगा, धन्यवाद स्टीव), लेकिन यह अभी भी पाया गया हर फ़ाइल के लिए निष्पादन चलाता है - एक विशाल ओवरहेड।
आप प्रत्येक निष्पादन से अधिकतम प्राप्त करने के लिए कुछ समय के लिए zgrep चलाना चाहते हैं:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargszgrep को अधिक से अधिक args (फ़ाइल नाम) की आपूर्ति करेगा, और इसे बार-बार निष्पादित करेगा जब तक कि उसने findकमांड द्वारा आपूर्ति की गई सभी फ़ाइलों का उपयोग नहीं किया हो । फ़ाइल और निर्देशिका नामों में से किसी में स्थान होने पर विकल्प -print0और -0विकल्पों का उपयोग करने की अनुमति देता है।
Mac OS X पर, आप बिना xargs के समान प्रभाव प्राप्त कर सकते हैं:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-Hकम से कम GNU grep में मिलान रेखा के साथ फ़ाइल का नाम दिखाने के लिए उपयोग करें ।
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
तो कुछ ऐसा है
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -rएक पेड़ के माध्यम से जाने के लिए उपयोग करना बेहतर होगा या अगर xargs zgrep
/bin/zgrep: -r: option not supportedअपने नव स्थापित ubuntu प्रणाली पर मिलता है।
xargsइसके बजाय उपयोग कर सकते हैं ।
@ वायो लगभग है। कमांड काम करेगा लेकिन आपको फ़ाइल का नाम नहीं बताएगा
निम्नलिखित को आपको फ़ाइल नाम भी बताना चाहिए:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
यह /dev/nullसुनिश्चित करने के अलावा कि zgrep दो फ़ाइल नाम देखता है, तो यह आपको फ़ाइल का नाम दिखाएगा यदि यह एक स्ट्रिंग पाता है
संपादित करें
आगे के शोध से पता चलता है कि मेरी मशीन (ओएस / एक्स) के लिए -execतर्क को खोजने के लिए संभव के रूप में कई फ़ाइलनाम जोड़ देगा (जिस तरह से xargsव्यवहार करता है)।
-exec- मैं पोर्टेबिलिटी के बारे में हूं इसलिए मैं इसे स्क्रिप्ट में इस्तेमाल नहीं करूंगा, लेकिन कमांड प्रॉम्प्ट के लिए बहुत अच्छा है।
find, लेकिन अधिकांश आधुनिक (उदाहरण के लिए डेबियन आधारित डिस्ट्रोस)।
-Hफ़ाइल का नाम हमेशा मिलान रेखा के साथ, /dev/nullहैक के बजाय GNU grep में कम से कम दिखाने के लिए उपयोग करें ।