egrep

2009-09-01 4 views
5

का उपयोग कर स्ट्रिंग वाली फ़ाइलों को कैसे ढूंढें, मैं लिनक्स के तहत विशिष्ट स्ट्रिंग वाली फ़ाइलों को ढूंढना चाहता हूं। मैंने कुछ ऐसा करने की कोशिश की लेकिन सफल नहीं हो सका:egrep

ढूंढें। -नाम * .txt | egrep mystring

उत्तर

12

यहां उपयोग करने की आवश्यकता है, यहां आप फ़ाइल नाम (find command का आउटपुट) egrep के इनपुट के रूप में भेज रहे हैं; आप वास्तव में फ़ाइलों की सामग्री पर egrep चलाने के लिए चाहते हैं।

find . -name "*.txt" -exec egrep mystring {} \; 

या और भी बेहतर

find . -name "*.txt" -print0 | xargs -0 egrep mystring 

चेक find command help क्या एक तर्क कर जांच करने के लिए:

यहाँ विकल्प के एक जोड़े हैं।
पहला दृष्टिकोण प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया को जन्म देगा, जबकि दूसरा एक से अधिक फाइलों को egrep के तर्क के रूप में पास करेगा; संभावित रूप से गंदे फ़ाइल नामों से निपटने के लिए -प्रिंट 0 और -0 झंडे की आवश्यकता होती है (उदाहरण के लिए फ़ाइल नाम में स्थान होने पर फ़ाइल नामों को सही तरीके से अलग करने की इजाजत देता है)।

+0

आप अपने पहले कमांड के अंत में '\ +' या '\;' गायब हैं। – spatz

+0

mystring के भीतर फ़ाइल नाम खोजने का यह प्रयास नहीं है? मुझे लगता है कि वह दूसरी तरफ देख रहा है। – Kevin

+0

@spatz: टिप्पणी के लिए धन्यवाद, मैंने उदाहरण तय किया। –

2

कोशिश:

find . -name '*.txt' | xargs egrep mystring 

वहाँ अपने संस्करण के साथ दो समस्याएं हैं:

सबसे पहले, *.txt पहले खोल से विस्तार किया जाएगा, तो आप मौजूदा निर्देशिका में फ़ाइलों की एक सूची दे रही है जो .txt में समाप्त होता है, उदाहरण के लिए, यदि आपके पास निम्न है:

[[email protected]:~]$ ls *.txt 
test.txt 
[[email protected]:~]$ 

आपके find कमांड find . -name test.txt में बदल जाएगा। बस वर्णन करने के लिए निम्नलिखित का प्रयास करें:

[[email protected]:~]$ echo find . -name *.txt 
find . -name test.txt 
[[email protected]:~]$ 

दूसरे, egrep नहीं फ़ाइल नाम STDIN से ले करता है। उन्हें तर्कों में बदलने के लिए आपको xargs

+0

मैं भी निम्नलिखित पैटर्न enclosing सुझाव है - –

+0

पर मिलान करने वाले पैटर्न को करने से रोकने के लिए कोट्स में नाम, मैं आप सभी को ऐसे व्यापक उत्तर प्रदान करने के लिए धन्यवाद देना चाहता हूं। – Tolga

1
find . -name *.txt | egrep mystring 

कि egrep के रूप में काम नहीं करेगा find . -name *.txt जो सिर्फ *.txt फ़ाइलों के लिए पथ हैं द्वारा उत्पन्न उत्पादन भीतर mystring के लिए खोज की जाएगी।

इसके बजाय, आप xargs उपयोग कर सकते हैं:

find . -name *.txt | xargs egrep mystring 
1

इस्तेमाल कर सकते हैं यहाँ एक उदाहरण है कि एक लाइन है कि ERROR के साथ शुरू होता है कि एक सब *.log फ़ाइलों की फ़ाइल पथ वापस आ जाएगी है :

find . -name "*.log" -exec egrep -l '^ERROR' {} \; 
1

वहाँ एक है आप

egrep -R "pattern" *.log 
+0

यह काम नहीं करता है। -R विकल्प केवल निर्देशिका में रिकर्स करता है अगर उन्हें तर्क सूची में आपूर्ति की जाती है। उस स्थिति में उन निर्देशिकाओं की सभी फाइलें न केवल .log में समाप्त होने वाली फ़ाइलों को पढ़ी जाएंगी। यदि आपको इस विधि के साथ कोई सफलता मिली है तो ऐसा इसलिए है क्योंकि वर्तमान निर्देशिका में .log में समाप्त होने वाली फ़ाइलें हैं क्योंकि तब खोल * .log को पार करती है। –

+0

शायद 'egrep -R "पैटर्न के साथ" - शामिल = *। लॉग .'? – moala

1

उपयोग कर सकते हैं egrep आप केवल फ़ाइल नाम चाहते हैं से पुनरावर्ती विकल्प:

find . -type f -name '*.txt' -exec egrep -l pattern {} \; 

यदि आप चाहते हैं फ़ाइल नाम और मैच:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \; 
संबंधित मुद्दे