मैं .gz
सभी निर्देशिकाओं और उपनिर्देशिकाओं में सभी फ़ाइलों के माध्यम से एक स्ट्रिंग के लिए कैसे प्राप्त करूं ?
मैं .gz
सभी निर्देशिकाओं और उपनिर्देशिकाओं में सभी फ़ाइलों के माध्यम से एक स्ट्रिंग के लिए कैसे प्राप्त करूं ?
जवाबों:
@Steve Weet लगभग वहीं है। अतिरिक्त तर्क के रूप में / dev / null का उपयोग फ़ाइल नाम को दिखाने के लिए बाध्य करने का एक अच्छा तरीका है (मुझे यह याद होगा, धन्यवाद स्टीव), लेकिन यह अभी भी पाया गया हर फ़ाइल के लिए निष्पादन चलाता है - एक विशाल ओवरहेड।
आप प्रत्येक निष्पादन से अधिकतम प्राप्त करने के लिए कुछ समय के लिए zgrep चलाना चाहते हैं:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
zgrep को अधिक से अधिक 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 में कम से कम दिखाने के लिए उपयोग करें ।