फाइल्स ढूंढना जिसमें एक निश्चित स्ट्रिंग होती है जिसमें फाइंड (1) और grep (1) का उपयोग होता है


70

find . -type f -print -exec cat {} \; | grep some string

ऊपर का कमांड फ़ाइल पथ को प्रिंट नहीं करता है।

मैं उपयोग कर रहा हूं Ubuntu, bash 4:।


शायद यह grep फ़िल्टर के कारण आपके अपेक्षित परिणामों को पूरा नहीं करता है। इसके बारे में क्या है:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
कलाकार जूल

आप किस लक्ष्य को प्राप्त करना चाहते हैं? आउटपुट पर आप फ़ाइलों से स्ट्रगल कर रहे हैं, आप उन फ़ाइलों का पथ चाहते हैं?
मॉर्कोब्रानकोविक

हां मैं उन फ़ाइलों के पथ को प्रिंट करना चाहता हूं जिनमें स्ट्रिंग 'कुछ स्ट्रिंग' हैं। @artistoex सुझाव सभी फ़ाइल पथ प्रिंट करता है।
एच। राबिया

आप बस ackवर्तमान निर्देशिका के तहत सभी फ़ाइलों के माध्यम से grep का उपयोग करना चाह सकते हैं , संभवतः केवल कुछ फ़ाइल प्रकारों पर फ़िल्टर करना।
जाप एल्डरिंग

जवाबों:


87

ऐसा इसलिए है क्योंकि आप grepपाठ की एक धारा खिला रहे हैं, जिसमें सिर्फ फ़ाइल नाम शामिल हैं। चूँकि आपने grep को तर्कों के रूप में कोई फ़ाइल नाम नहीं दिया था, इसलिए यह उम्मीद नहीं की जा सकती है कि मिलान वाली फ़ाइल किस फ़ाइल से आई है। उपयोग करें xargs:

find . -type f -print | xargs grep "some string"

चूँकि आपको GNU मिल गया है / xargs, यह फ़ाइल नाम पढ़ने के लिए xargs का एक सुरक्षित तरीका है:

find . -type f -print0 | xargs -0 grep "some string"

यदि आप केवल उन फिल्नामों को चाहते हैं जिनमें मिलान रेखा दिखाए बिना एक मिलान रेखा है:

find . -type f -print0 | xargs -0 grep -l "some string"

मैं उपरोक्त आदेशों को खोज और प्रतिस्थापन के साथ कैसे संयोजित करूंगा? में, grep तो sed?
CMCDragonkai

1
खोज | grep पाइपलाइन आउटपुट फ़ाइल नाम, इसलिए:sed '...' $(find ... | xargs grep -l ...)
ग्लेन जैकमैन

107

मैं उपयोग करता हूं

grep "some string" . -R

और यह तेजी से काम कर रहा है

ps

अधिक जटिल उपयोग मामला

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

परम मैं स्पष्टीकरण पढ़ने के लिए

grep --help | grep -- -i

17
और -nअगर आपको लाइन नंबर चाहिए। सरलीकृत उत्तर के लिए +1।
चाड स्कीटर्स

@ChadSkeeters बिल्कुल। का उपयोग करते हुए खोज इस तरह के समाधान नहीं देता है।
आर्चरजोडसन

1
इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए, ईमानदार होने के लिए। वर्तमान में पूरी तरह से एक विवरण का चयन किया है।

11

मैं अक्सर जटिल फ़ोल्डर संरचनाओं में स्रोत कोड खोजता हूं और मुझे इसका उपयोग करना उपयोगी लगता है:

cd /your/folder/
grep -rHino "your string"

उन मापदंडों के साथ, खोज का उपयोग किए बिना , मैं फ़ाइल को पूर्ण पथ और पंक्ति संख्या प्राप्त करता हूं जिसमें निर्दिष्ट स्ट्रिंग शामिल है

यह भी याद करने के लिए आसान है, क्योंकि यह मार एक तरह से अपनी खोज के माध्यम से तों राइनो :)

मैं दिखाऊंगा कि यह एक त्वरित उदाहरण के साथ कैसे काम करता है।

चलो बिल्ली का उपयोग करके एक फ़ाइल की सामग्री प्रदर्शित करते हैं:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

और स्ट्रिंग "iptables -P" युक्त सभी फ़ाइलों के लिए पुनरावर्ती खोज करें:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

जैसा कि आप आउटपुट में देख सकते हैं कि हमारा फ़ाइल नाम है: हिट रो: सर्च किया हुआ स्ट्रिंग

यहाँ प्रयुक्त मापदंडों का अधिक विस्तृत विवरण दिया गया है:

-प्रत्येक डायरेक्टरी ऑपरेंड के लिए, उस डायरेक्टरी की सभी फाइल्स को रिकर्सिअसली पढ़ें और प्रोसेस करें। कमांड लाइन पर प्रतीकात्मक लिंक का पालन करें, लेकिन पुनरावृत्ति का सामना करने वाले सिमिलिंक को छोड़ दें। ध्यान दें कि यदि कोई फ़ाइल ऑपरेंड नहीं दिया गया है, तो grep वर्किंग डायरेक्टरी को खोजता है। यह '--directories = recurse' विकल्प के समान है।

-i प्रत्येक मैच के लिए फ़ाइल का नाम प्रिंट करें। यह डिफ़ॉल्ट है जब खोज करने के लिए एक से अधिक फ़ाइल है।

-एक इनपुट फ़ाइल के भीतर 1-आधारित लाइन नंबर के साथ आउटपुट की प्रत्येक पंक्ति को उपसर्ग करें। -n POSIX द्वारा निर्दिष्ट है।)

-H प्रत्येक मैच के लिए फ़ाइल का नाम प्रिंट करें। यह डिफ़ॉल्ट है जब खोज करने के लिए एक से अधिक फ़ाइल है।

-o मिलान लाइनों के केवल मिलान किए गए (गैर-खाली) भागों को प्रिंट करें, प्रत्येक ऐसे भाग के साथ एक अलग आउटपुट लाइन पर। आउटपुट लाइनें इनपुट के रूप में एक ही सीमांकक का उपयोग करती हैं, और सीमांकक शून्य बाइट्स हैं यदि -z (--null-data) का भी उपयोग किया जाता है (अन्य विकल्प देखें)।


1

मेरी वरीयता

| फ़ाइल ढूंढे | grep ont find file बनाये | फ़ाइल का पूर्ण पथ दिखाएँ

/type f -exec grep 'some string' {} \; खोजें -execo इको {} \;


0

रजत खोजक फ़ाइलों और सामग्री की खोज करने के लिए एक बहुत तेज़ और आसान उपयोग है।

आपकी समस्या को हल करने के लिए चांदी खोजक कमांड इस तरह दिखेगी ...

ag 'some string' -l

-l केवल उन प्रिंटनामों का मिलान करें जिनमें मिलान होता है (मिलान लाइनों को प्रिंट न करें)

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