के साथ find:
cd /the/dir
find . -type f -exec grep pattern {} +
( -type fकेवल नियमित फ़ाइलों में खोज करना है (यदि वे नियमित फ़ाइलों की ओर इशारा करते हुए भी सहानुभूति को छोड़कर हैं)। यदि आप निर्देशिकाओं को छोड़कर किसी भी प्रकार की फ़ाइल में खोज करना चाहते हैं (लेकिन सावधान रहें कुछ प्रकार की फाइलें जैसे डेटो या देव / शून्य हैं) आप आम तौर पर पढ़ना नहीं चाहते), -type fGNU- विशिष्ट के साथ बदलें ! -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-bufferedGNU के विकल्प का उपयोग करें grep।
यदि patternएक निश्चित स्ट्रिंग है, तो -Fविकल्प जोड़ने से मामलों में सुधार हो सकता है।
यदि यह मल्टी-बाइट कैरेक्टर डेटा नहीं है, या यदि उस पैटर्न के मिलान के लिए, तो इससे कोई फर्क नहीं पड़ता कि डेटा मल्टी-बाइट कैरेक्टर है या नहीं, फिर:
cd /the/dir &&
LC_ALL=C grep -r pattern .
प्रदर्शन में काफी सुधार कर सकता है।
यदि आप अक्सर ऐसी खोज करते हैं, तो आप अपने डेटा को कई खोज इंजनों में से किसी एक का उपयोग करके अनुक्रमित करना चाहते हैं।
findसाथxargsया उपयोगgrep -R