जब मैं कुछ सामग्री के लिए एक पूरे पेड़ को खोजना चाहता हूं, तो मैं उपयोग करता हूं
find . -type f -print0 | xargs -0 grep <search_string>
क्या प्रदर्शन या संक्षिप्तता के संदर्भ में ऐसा करने का बेहतर तरीका है?
जब मैं कुछ सामग्री के लिए एक पूरे पेड़ को खोजना चाहता हूं, तो मैं उपयोग करता हूं
find . -type f -print0 | xargs -0 grep <search_string>
क्या प्रदर्शन या संक्षिप्तता के संदर्भ में ऐसा करने का बेहतर तरीका है?
जवाबों:
जांचें कि क्या आपका grep
समर्थन -r
विकल्प ( पुनर्खरीद के लिए ):
grep -r <search_string> .
--exclude-dir
प्रदर्शन को संबोधित करने के बारे में एक टिप्पणी जोड़ें और हमारे पास एक विजेता है!
grep
हाल के फ्रीबीएसडी और लिनक्स डिस्ट्रोस इसका समर्थन करते हैं। और क्यों --exclude-dir
? क्या आपने एक पूरे पेड़ की खोज करने के लिए नहीं कहा ?
--exclude-dir
वास्तव में मेरे उपयोग के मामले में बहुत उपयोगी है (क्योंकि सबट्री के हिस्से बड़े हैं, लेकिन बेकार हैं) और मैंने प्रदर्शन के बारे में पूछा ... लेकिन आप सही हैं, यह आवश्यक नहीं है।
--exclude-dir
GNU के लिए अनन्य है grep
। (-:
एक उप इष्टतम जवाब: के उत्पादन में पाइप के बजाय find
में grep
, तुम बस चला सकते हैं
find . -type f -exec grep 'research' {} '+'
और वॉइला, दो के बजाय एक कमांड!
स्पष्टीकरण:
find . -type f
सभी नियमित फ़ाइलें खोजें।
-exec grep 'research'
grep 'शोध'
{}
फ़ाइल नाम में
'+'
सभी फ़ाइलनामों में से एक आदेश का उपयोग करें, एक बार फ़ाइलनाम के अनुसार नहीं।
नायब: साथ ';'
एक बार फ़ाइल नाम दिया गया होगा।
इसके अलावा, यदि आप स्रोत कोड को संसाधित करने के लिए इसका उपयोग करते हैं, तो आप देख सकते हैं ack
, जो आसानी से कोड बिट्स की तलाश के लिए बना है।
संपादित करें:
आप उस शोध को थोड़ा बढ़ा सकते हैं। सबसे पहले, आप के -name ''
स्विच का उपयोग कर सकते हैंfind
निर्दिष्ट नामकरण पैटर्न के साथ फ़ाइलों को देखने के लिए ।
उदाहरण के लिए :
केवल फ़ाइलें जो लॉग के अनुरूप हैं: -name '*.log'
केवल फाइलें जो हेडर के अनुरूप हैं, लेकिन आप अपने फ़ाइल एक्सटेंशन के लिए अपरकेस या लोअरकेस के साथ नहीं चिपक सकते हैं: -iname *.c
Nb: like grep
और ack
, के लिए-i
स्विच का अर्थ है इस मामले में असंवेदनशील।
उस स्थिति में, grep बिना रंग और बिना लाइन नंबर के दिखाई देगा।
आप इसे --color
और के साथ बदल सकते हैं-n
स्विच के साथ (क्रमशः फाइलों में रंग और रेखाएं)।
अंत में, आपके पास कुछ इस तरह हो सकता है:
find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'
उदाहरण के लिए
$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+'
./test2/target.c:1:hello
-name '*.log'
इसे फिल्टर के साथ पसंद करता हूं जैसे यह तेज है।
यदि आप उपनिर्देशिका में नीचे जाना चाहते हैं:
grep -R 'pattern' .
-R
विकल्प के लिए एक मानक विकल्प नहीं है, लेकिन सबसे आम द्वारा समर्थित है grep
कार्यान्वयन।
-r
-R
grep
कार्यान्वयन पुनरावृत्ति पकड़ते हैं, मुझे लगता है। अन्यथा यह निर्भर करता है कि आप "पेड़" से क्या मतलब है।
grep
करना चाहिए। उपयोगकर्ता अपने निर्देशिका संरचना में प्रतीकात्मक कड़ी छोरों है, तो अच्छी तरह से, उस उपयोगकर्ता के समस्या है :-)
/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(-XI में ) मुझे खो देने वाले औजारों की तरह नहीं खोया (जब तक कि वे अजीब जादू वे "एआई" नहीं कहते) - (-;
जैसा कि ऊपर उल्लेख किया गया है -r
या -R
(वांछित सिम्बलिन हैंडलिंग के आधार पर) एक त्वरित विकल्प है।
हालांकि -d <action>
कई बार उपयोगी हो सकता है।
-d
जब आप वर्तमान स्तर को स्कैन करना चाहते हैं, तो अच्छी बात यह है कि स्किप कमांड है, जो "grep: directory_name: एक निर्देशिका" है।
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
और निश्चित रूप से:
$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$
-d skip
विकल्प एक और स्क्रिप्ट के अंदर वास्तव में काम तो आप की जरूरत नहीं है है 2> /dev/null
। :)
यदि आप बहुत सारी फ़ाइलों के साथ काम कर रहे हैं, तो grep तेजी से चलता है यदि आप उन फ़ाइलों को नीचे दबा देते हैं, जिन्हें सबफ़ोल्डर्स में सभी फ़ाइलों को छोड़ने के बजाय खोज करने की आवश्यकता होती है।
मैं कभी-कभी इस प्रारूप का उपयोग करता हूं:
grep "primary" `find . | grep cpp$`
.
उस अंत के सबफ़ोल्डर में सभी फ़ाइलें खोजें cpp
। फिर "प्राथमिक" के लिए उन फ़ाइलों को grep करें।
यदि आप चाहें, तो आप उन परिणामों को आगे के grep कॉल में पाइप कर सकते हैं:
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"