मैं grep के लिए फ़ाइलों की सूची कैसे पास करूं


98

मैं findउन फ़ाइलों की एक सूची का उपयोग कर रहा हूं और प्राप्त कर रहा हूं जिनके grepमाध्यम से मैं चाहता हूं । मैं उस सूची को कैसे पाइप करूं grep?

जवाबों:


116

खैर, सामान्य मामला जो किसी कमांड के साथ काम करता है जो stdout को लिखता है, का उपयोग करना है xargs, जो आपको कमांड के अंत में किसी भी संख्या में कमांड-लाइन तर्क संलग्न करने देगा:

$ find … | xargs grep 'search'

या grepbackticks के साथ अपनी लाइन में कमांड एम्बेड करने के लिए या $(), जो कमांड को चलाएगा और इसके आउटपुट को बदलेगा:

$ grep 'search' $(find …)

ध्यान दें कि यदि फ़ाइल नाम में व्हाट्सएप, या कुछ अन्य "अजीब अक्षर" ( \'"xargs के \[*?लिए $(find …)) हैं , तो ये कमांड काम नहीं करते हैं ।


हालांकि, findदिए गए तर्कों पर एक कार्यक्रम को निष्पादित करने की क्षमता के विशिष्ट मामले में अंतर्निहित है:

$ find … -exec grep 'search' {} \;

के बीच सब कुछ -execऔर ;निष्पादित करने के लिए आदेश है; {}द्वारा फाइल नाम के साथ प्रतिस्थापित किया जाता है find। जो grepप्रत्येक फ़ाइल के लिए एक अलग निष्पादित करेगा ; चूँकि grepकई फ़ाइल नाम ले सकते हैं और उन सभी को खोज सकते हैं, आप यह बताने के ;लिए बदल सकते हैं कि +सभी मिलान फ़ाइलनामों को पास करने के लिए क्या करें grep:

$ find … -exec grep 'search' {} \+

1
यह ध्यान दिया जाना चाहिए कि पहले दो रूपों में रिक्त स्थान वाले फ़ाइलनाम के साथ काम नहीं करता है।
19

1
मैं पसंद करता हूं find ... -type f -print0 | xargs -r0 grep 'search' /dev/null। QED। जबकि -exec +बहुत कुशल है, यह खोज के सभी संस्करण पर मौजूद नहीं है।
सेसगे

अफसोस की बात है कि मैं आपको 3 बार सही नहीं देख सकता।
आर्कबर्ड

3
मैं -execइसके बजाय के बजाय का उपयोग करने का सुझाव देता हूं xargs। आप का उपयोग करते हैं -execमें find, यह करने के लिए केवल एक ही खोल पैदा करेगा grep सामग्री के लिए। यदि आप इसका उपयोग करते हैं xargs, तो यह दो गोले बनाएगा: एक के लिए findऔर दूसरा इसके लिए xargs

2
प्रयोग द्वारा मुझे लगता है कि $ find … -exec grep 'search' {} \+रूप है बहुत सबसे तेजी से।
गोगुड़

9

grep(जैसे गैर-एम्बेडेड लिनक्स या बीएसडी या मैक ओएस एक्स पर) के कुछ संस्करणों में -rएक पुनरावर्ती खोज करने का विकल्प होता है। OpenBSD पर, उपयोग करें -R(और --excludeनीचे उदाहरण में ऐसा नहीं है )। इसके findसाथ सरल संयोजनों को शामिल किया गया है grep

अपने कार्यान्वयन नहीं है, तो -Rझंडा, या यदि आप अधिक सजावटी फ़ाइल मिलान मापदंड चाहते हैं, आप उपयोग कर सकते हैं -execके प्राथमिक findनिष्पादित करने के लिए grep। कुछ पुराने findकार्यान्वयन समर्थन नहीं करते हैं -exec... +; इन प्रणालियों पर, के ;बजाय का उपयोग करें +(यह grepएक बार प्रति फ़ाइल कॉल करेगा , इसलिए यह धीमा होगा, लेकिन अन्यथा परिणाम समान होगा)। फ़ाइल के नाम को दिखाने के लिए /dev/nullट्रिक पर ध्यान दें, grepभले ही वह एकल फ़ाइल पर बुलाया जाए (GNU grep और FreeBSD / NetBSD / OSX grep में एक -Hही प्रभाव प्राप्त करने का विकल्प है)।

find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .

2
GNU grep-Hहमेशा फ़ाइल नाम प्रिंट करने का विकल्प होता है।
enzotib
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.