के साथ find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type f
केवल नियमित फ़ाइलों में खोज करना है (यदि वे नियमित फ़ाइलों की ओर इशारा करते हुए भी सहानुभूति को छोड़कर हैं)। यदि आप निर्देशिकाओं को छोड़कर किसी भी प्रकार की फ़ाइल में खोज करना चाहते हैं (लेकिन सावधान रहें कुछ प्रकार की फाइलें जैसे डेटो या देव / शून्य हैं) आप आम तौर पर पढ़ना नहीं चाहते), -type f
GNU- विशिष्ट के साथ बदलें ! -xtype d
( सिम्लिंक रिज़ॉल्यूशन के बाद -xtype d
टाइप डायरेक्टरी की फ़ाइलों के लिए मिलान )।
GNU के साथ grep
:
grep -r pattern /the/dir
(लेकिन खबरदार कि जब तक आपके पास GNU grep का हालिया संस्करण नहीं है, तब तक यह निर्देशिका में उतरते समय सहानुभूति का पालन करेगा)। जब तक आप कोई -D read
विकल्प नहीं जोड़ते, तब तक गैर-नियमित फ़ाइलों की खोज नहीं की जाएगी । GNU के हाल के संस्करण grep
अभी भी सिम्बलिंक के अंदर नहीं खोजेंगे।
जीएनयू के बहुत पुराने संस्करणों find
ने मानक {} +
वाक्यविन्यास का समर्थन नहीं किया , लेकिन वहां आप गैर-मानक का उपयोग कर सकते हैं:
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
प्रदर्शन I / O बाध्य होने की संभावना है। यह खोज करने का समय है, भंडारण से उस सभी डेटा को पढ़ने के लिए आवश्यक समय होगा।
यदि डेटा एक निरर्थक डिस्क सरणी पर है, तो एक बार में कई फ़ाइलों को पढ़ने से प्रदर्शन में सुधार हो सकता है (और अन्यथा उन्हें नीचा दिखा सकता है)। यदि प्रदर्शन I / O बाध्य नहीं हैं (क्योंकि उदाहरण के लिए सभी डेटा कैश में है), और आपके पास कई CPU हैं, तो समवर्ती greps
भी मदद कर सकता है। आप ऐसा जीएनयू xargs
के -P
विकल्प के साथ कर सकते हैं ।
उदाहरण के लिए, यदि डेटा 3 ड्राइव के साथ RAID1 सरणी पर है, या यदि डेटा कैश में है और आपके पास 3 सीपीयू हैं जिनका समय समाप्त हो गया है:
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(यहां -n1000
एक नई grep
हर 1000 फ़ाइलों को एक समय में समानांतर में चलने वाली 3 तक का उपयोग करने के लिए )।
हालाँकि, ध्यान दें कि यदि आउटपुट grep
को पुनर्निर्देशित किया जाता है, तो आप 3 grep
प्रक्रियाओं से बुरी तरह से इंटरलेव्ड आउटपुट के साथ समाप्त हो जाएंगे , जिस स्थिति में आप इसे चलाना चाहते हैं:
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(एक हालिया GNU या FreeBSD सिस्टम पर) या --line-buffered
GNU के विकल्प का उपयोग करें grep
।
यदि pattern
एक निश्चित स्ट्रिंग है, तो -F
विकल्प जोड़ने से मामलों में सुधार हो सकता है।
यदि यह मल्टी-बाइट कैरेक्टर डेटा नहीं है, या यदि उस पैटर्न के मिलान के लिए, तो इससे कोई फर्क नहीं पड़ता कि डेटा मल्टी-बाइट कैरेक्टर है या नहीं, फिर:
cd /the/dir &&
LC_ALL=C grep -r pattern .
प्रदर्शन में काफी सुधार कर सकता है।
यदि आप अक्सर ऐसी खोज करते हैं, तो आप अपने डेटा को कई खोज इंजनों में से किसी एक का उपयोग करके अनुक्रमित करना चाहते हैं।
find
साथxargs
या उपयोगgrep -R