grep -R
( grep
ओएस / एक्स 10.8 और इसके बाद के संस्करण पर पाए गए संशोधित जीएनयू को छोड़कर , सिम्बलिंक्स का अनुसरण करता है, इसलिए भले ही फाइलों में केवल 100 ~/Documents
जीबी फाइलें हों , /
उदाहरण के लिए अभी भी सिमलिंक हो सकता है और आप फाइलों सहित पूरे फाइल सिस्टम को स्कैन करेंगे। पसंद है /dev/zero
। grep -r
नए GNU के साथ प्रयोग करें grep
, या मानक सिंटैक्स का उपयोग करें:
find ~/Documents -type f -exec grep Milledgeville /dev/null {} +
(हालांकि ध्यान दें कि निकास स्थिति इस तथ्य को प्रतिबिंबित नहीं करेगी कि पैटर्न मिलान किया गया है या नहीं)।
grep
पैटर्न से मेल खाने वाली रेखाओं को खोजता है। उसके लिए, एक बार में एक लाइन को मेमोरी में लोड करना होगा। grep
कई अन्य grep
कार्यान्वयनों के विपरीत GNU में बाइनरी फ़ाइलों में खोज को पढ़ने और समर्थन करने वाली लाइनों के आकार की सीमा नहीं होती है। इसलिए, यदि आपको बहुत बड़ी लाइन (यानी दो न्यूलाइन वर्णों के साथ बहुत दूर तक की एक फ़ाइल) मिली है, जो उपलब्ध मेमोरी से बड़ी है, तो यह विफल हो जाएगी।
यह आमतौर पर एक विरल फ़ाइल के साथ होता है। आप इसे पुन: पेश कर सकते हैं:
truncate -s200G some-file
grep foo some-file
कि एक के आसपास काम करना मुश्किल है। आप इसे (अभी भी GNU के साथ grep
) कर सकते हैं:
find ~/Documents -type f -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} +
इनपुट को खिलाने से पहले NUL वर्णों के अनुक्रमों को एक नई रेखा वर्ण में परिवर्तित करता है grep
। यह उन मामलों के लिए कवर होता है जहाँ समस्या विरल फाइलों के कारण होती है।
आप इसे केवल बड़ी फ़ाइलों के लिए अनुकूलित कर सकते हैं:
find ~/Documents -type f \( -size -100M -exec \
grep -He Milledgeville {} + -o -exec sh -c 'for i do
tr -s "\0" "\n" < "$i" | grep --label="$i" -He "$0"
done' Milledgeville {} + \)
यदि फ़ाइलें विरल नहीं हैं और आपके पास GNU का एक संस्करण grep
है 2.6
, तो आप --mmap
विकल्प का उपयोग कर सकते हैं । लाइनों को कॉपी किए जाने के विपरीत मेमोरी में एमएमपीड किया जाएगा, जिसका अर्थ है कि सिस्टम हमेशा पेज को फ़ाइल में पेजिंग करके मेमोरी को पुनः प्राप्त कर सकता है। वह विकल्प GNU grep
2.6 में हटा दिया गया था