जवाबों:
खैर, सामान्य मामला जो किसी कमांड के साथ काम करता है जो stdout को लिखता है, का उपयोग करना है xargs
, जो आपको कमांड के अंत में किसी भी संख्या में कमांड-लाइन तर्क संलग्न करने देगा:
$ find … | xargs grep 'search'
या grep
backticks के साथ अपनी लाइन में कमांड एम्बेड करने के लिए या $()
, जो कमांड को चलाएगा और इसके आउटपुट को बदलेगा:
$ grep 'search' $(find …)
ध्यान दें कि यदि फ़ाइल नाम में व्हाट्सएप, या कुछ अन्य "अजीब अक्षर" ( \'"
xargs के \[*?
लिए $(find …)
) हैं , तो ये कमांड काम नहीं करते हैं ।
हालांकि, find
दिए गए तर्कों पर एक कार्यक्रम को निष्पादित करने की क्षमता के विशिष्ट मामले में अंतर्निहित है:
$ find … -exec grep 'search' {} \;
के बीच सब कुछ -exec
और ;
निष्पादित करने के लिए आदेश है; {}
द्वारा फाइल नाम के साथ प्रतिस्थापित किया जाता है find
। जो grep
प्रत्येक फ़ाइल के लिए एक अलग निष्पादित करेगा ; चूँकि grep
कई फ़ाइल नाम ले सकते हैं और उन सभी को खोज सकते हैं, आप यह बताने के ;
लिए बदल सकते हैं कि +
सभी मिलान फ़ाइलनामों को पास करने के लिए क्या करें grep
:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
। QED। जबकि -exec +
बहुत कुशल है, यह खोज के सभी संस्करण पर मौजूद नहीं है।
$ find … -exec grep 'search' {} \+
रूप है बहुत सबसे तेजी से।
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' .
GNU grep
-H
हमेशा फ़ाइल नाम प्रिंट करने का विकल्प होता है।