का उपयोग कर स्ट्रिंग वाली फ़ाइलों को कैसे ढूंढें, मैं लिनक्स के तहत विशिष्ट स्ट्रिंग वाली फ़ाइलों को ढूंढना चाहता हूं। मैंने कुछ ऐसा करने की कोशिश की लेकिन सफल नहीं हो सका:egrep
ढूंढें। -नाम * .txt | egrep mystring
का उपयोग कर स्ट्रिंग वाली फ़ाइलों को कैसे ढूंढें, मैं लिनक्स के तहत विशिष्ट स्ट्रिंग वाली फ़ाइलों को ढूंढना चाहता हूं। मैंने कुछ ऐसा करने की कोशिश की लेकिन सफल नहीं हो सका:egrep
ढूंढें। -नाम * .txt | egrep mystring
यहां उपयोग करने की आवश्यकता है, यहां आप फ़ाइल नाम (find command
का आउटपुट) egrep के इनपुट के रूप में भेज रहे हैं; आप वास्तव में फ़ाइलों की सामग्री पर egrep चलाने के लिए चाहते हैं।
find . -name "*.txt" -exec egrep mystring {} \;
या और भी बेहतर
find . -name "*.txt" -print0 | xargs -0 egrep mystring
चेक find command help क्या एक तर्क कर जांच करने के लिए:
यहाँ विकल्प के एक जोड़े हैं।
पहला दृष्टिकोण प्रत्येक फ़ाइल के लिए एक नई प्रक्रिया को जन्म देगा, जबकि दूसरा एक से अधिक फाइलों को egrep के तर्क के रूप में पास करेगा; संभावित रूप से गंदे फ़ाइल नामों से निपटने के लिए -प्रिंट 0 और -0 झंडे की आवश्यकता होती है (उदाहरण के लिए फ़ाइल नाम में स्थान होने पर फ़ाइल नामों को सही तरीके से अलग करने की इजाजत देता है)।
कोशिश:
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
मैं भी निम्नलिखित पैटर्न enclosing सुझाव है - –
पर मिलान करने वाले पैटर्न को करने से रोकने के लिए कोट्स में नाम, मैं आप सभी को ऐसे व्यापक उत्तर प्रदान करने के लिए धन्यवाद देना चाहता हूं। – Tolga
find . -name *.txt | egrep mystring
कि egrep
के रूप में काम नहीं करेगा find . -name *.txt
जो सिर्फ *.txt
फ़ाइलों के लिए पथ हैं द्वारा उत्पन्न उत्पादन भीतर mystring
के लिए खोज की जाएगी।
इसके बजाय, आप xargs
उपयोग कर सकते हैं:
find . -name *.txt | xargs egrep mystring
आप
find . -iname *.txt -exec egrep mystring \{\} \;
इस्तेमाल कर सकते हैं यहाँ एक उदाहरण है कि एक लाइन है कि ERROR
के साथ शुरू होता है कि एक सब *.log
फ़ाइलों की फ़ाइल पथ वापस आ जाएगी है :
find . -name "*.log" -exec egrep -l '^ERROR' {} \;
वहाँ एक है आप
egrep -R "pattern" *.log
यह काम नहीं करता है। -R विकल्प केवल निर्देशिका में रिकर्स करता है अगर उन्हें तर्क सूची में आपूर्ति की जाती है। उस स्थिति में उन निर्देशिकाओं की सभी फाइलें न केवल .log में समाप्त होने वाली फ़ाइलों को पढ़ी जाएंगी। यदि आपको इस विधि के साथ कोई सफलता मिली है तो ऐसा इसलिए है क्योंकि वर्तमान निर्देशिका में .log में समाप्त होने वाली फ़ाइलें हैं क्योंकि तब खोल * .log को पार करती है। –
शायद 'egrep -R "पैटर्न के साथ" - शामिल = *। लॉग .'? – moala
उपयोग कर सकते हैं egrep आप केवल फ़ाइल नाम चाहते हैं से पुनरावर्ती विकल्प:
find . -type f -name '*.txt' -exec egrep -l pattern {} \;
यदि आप चाहते हैं फ़ाइल नाम और मैच:
find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;
आप अपने पहले कमांड के अंत में '\ +' या '\;' गायब हैं। – spatz
mystring के भीतर फ़ाइल नाम खोजने का यह प्रयास नहीं है? मुझे लगता है कि वह दूसरी तरफ देख रहा है। – Kevin
@spatz: टिप्पणी के लिए धन्यवाद, मैंने उदाहरण तय किया। –