मुझे यकीन नहीं है:
grep -r -i 'the brown dog' /*
वास्तव में तुम्हारा मतलब क्या है इसका मतलब यह होगा कि सभी गैर-छिपी हुई फ़ाइलों में जीआरईपी और डायर इन /(लेकिन फिर भी छिपी हुई फाइलों के अंदर देखो और डायरियों के अंदर)।
आपका मतलब मान लिया गया है:
grep -r -i 'the brown dog' /
ध्यान देने योग्य कुछ बातें:
- सभी
grepकार्यान्वयन समर्थन नहीं करते हैं -r। और ऐसा करने वालों के बीच, व्यवहार भिन्न होते हैं: निर्देशिका ट्री (जब आप एक ही फ़ाइल में कई बार देख सकते हैं या अनंत छोरों में भी चल सकते हैं, तो इसका मतलब है कि कुछ निर्देशिकाओं के प्रति सहानुभूति का पालन करते हैं), कुछ नहीं करेंगे। कुछ डिवाइस फ़ाइलों के अंदर देखेंगे (और /dev/zeroउदाहरण के लिए इसमें कुछ समय लगेगा ) या पाइप या बाइनरी फाइलें ..., कुछ नहीं होगा।
- के रूप में यह कुशल है
grepजैसे ही यह उन्हें पता चलता है अंदर फाइलों की तलाश में शुरू होता है। लेकिन जब यह एक फ़ाइल में दिखता है, तो यह अब और अधिक फ़ाइलों की तलाश में नहीं है (जो कि शायद ज्यादातर मामलों में भी है)
तुम्हारी:
find / -type f -exec grep -i 'the brown dog' {} \;
( -rजो यहाँ मतलब नहीं था हटा दिया ) बहुत अक्षम है क्योंकि आप grepप्रति फ़ाइल एक चला रहे हैं । ;केवल उन आदेशों के लिए उपयोग किया जाना चाहिए जो केवल एक तर्क को स्वीकार करते हैं। इसके अलावा यहाँ, क्योंकि grepकेवल एक फ़ाइल में दिखता है, यह फ़ाइल नाम को प्रिंट नहीं करेगा, इसलिए आपको पता नहीं होगा कि मैच कहाँ हैं।
आप डिवाइस फ़ाइलों, पाइपों, सिम्लिंक्स के अंदर नहीं देख रहे हैं ..., आप सिमिलिंक का पालन नहीं कर रहे हैं, लेकिन आप संभावित रूप से अंदर की चीजों को देख रहे हैं /proc/mem।
find / -type f -exec grep -i 'the brown dog' {} +
बहुत बेहतर होगा क्योंकि grepजितना संभव हो कम कमांड चलाया जाएगा। आपको फ़ाइल नाम तब तक मिलेगा जब तक कि अंतिम रन में केवल एक फ़ाइल न हो। इसके लिए यह उपयोग करना बेहतर है:
find / -type f -exec grep -i 'the brown dog' /dev/null {} +
या GNU के साथ grep:
find / -type f -exec grep -Hi 'the brown dog' {} +
ध्यान दें कि grepजब तक findइसे चबाने के लिए पर्याप्त फाइलें नहीं मिलेंगी, तब तक इसे शुरू नहीं किया जाएगा , इसलिए कुछ शुरुआती देरी होगी। और findअधिक फ़ाइलों की खोज तब तक नहीं करेगा जब तक कि पिछला grepवापस नहीं आ जाता है। बड़ी फ़ाइल सूची को आबंटित करने और पास करने का कुछ (शायद नगण्य) प्रभाव पड़ता है, इसलिए सभी में यह संभवत: कम कुशल होने की तुलना में है grep -rजो सिमलिंक का पालन नहीं करता है या उपकरणों के अंदर नहीं दिखता है।
GNU टूल्स के साथ:
find / -type f -print0 | xargs -r0 grep -Hi 'the brown dog'
ऊपर के रूप में, grepसंभव के रूप में कुछ उदाहरणों को चलाया जाएगा, लेकिन पहले बैच findमें पहला grepआह्वान देख रहे हैं, जबकि अधिक फ़ाइलों की तलाश में रहेगा । हालांकि यह एक फायदा हो सकता है या नहीं। उदाहरण के लिए, घूर्णी हार्ड ड्राइव पर संग्रहीत डेटा के साथ, findऔर grepडिस्क पर विभिन्न स्थानों पर संग्रहीत डेटा तक पहुंचने से डिस्क सिर को लगातार हिलाकर डिस्क थ्रूपुट को धीमा कर देगा। एक RAID सेटअप में (जहां findऔर grepअलग-अलग डिस्क तक पहुंच हो सकती है) या एसएसडी पर, यह एक सकारात्मक अंतर बना सकता है।
RAID सेटअप में, कई समवर्ती grep चालान चलाने से चीजों में सुधार भी हो सकता है। RAID1 भंडारण पर GNU टूल के साथ 3 डिस्क के साथ,
find / -type f -print0 | xargs -r0 -P2 grep -Hi 'the brown dog'
प्रदर्शन में काफी वृद्धि कर सकता है। ध्यान दें कि दूसरा grepकेवल तभी शुरू होगा जब पहले grepकमांड को भरने के लिए पर्याप्त फाइलें मिल गई हों । आप इसके लिए जल्द ही एक -nविकल्प जोड़ सकते हैं xargs(और प्रति grepइनवॉइस कम फाइलें पास कर सकते हैं )।
यह भी ध्यान दें कि यदि आप xargsकिसी भी चीज़ को टर्मिनल डिवाइस पर रीडायरेक्ट कर रहे हैं , तो grepsएस उनके आउटपुट को बफर करना शुरू कर देगा , जिसका अर्थ है कि उन grepएस का आउटपुट शायद गलत तरीके से इंटरलेय किया जाएगा। आपको stdbuf -oLउनके आसपास काम करने के लिए (जहां GNU या फ्रीबीएसडी पर उपलब्ध है) का उपयोग करना होगा (आपको अभी भी बहुत लंबी लाइनों (आमतौर पर 4KiB) के साथ समस्या हो सकती है) या प्रत्येक ने एक अलग फ़ाइल में अपना आउटपुट लिखा है और उन्हें संक्षिप्त करें अंत में सभी।
यहाँ, आप जिस स्ट्रिंग की तलाश कर रहे हैं, वह निश्चित है (रिजेक्सप नहीं) तो -Fविकल्प का उपयोग करने से अंतर हो सकता है (जैसा कि grepकार्यान्वयन को पहले से ही ऑप्टिमाइज़ करने का तरीका पता नहीं है )।
एक और बात जो एक बड़ा अंतर पैदा कर सकती है वह है सी को लोकेल को ठीक करना यदि आप मल्टी-बाइट लोकेल में हैं:
find / -type f -print0 | LC_ALL=C xargs -r0 -P2 grep -Hi 'the brown dog'
अंदर देखने से बचने के लिए /proc, /sys..., -xdevउस फ़ाइल सिस्टम का उपयोग करें और निर्दिष्ट करें जिसे आप खोजना चाहते हैं:
LC_ALL=C find / /home -xdev -type f -exec grep -i 'the brown dog' /dev/null {} +
या जिन रास्तों को आप स्पष्ट रूप से बाहर करना चाहते हैं, उनके बारे में बताएं:
LC_ALL=C find / \( -path /dev -o -path /proc -o -path /sys \) -prune -o \
-type f -exec grep -i 'the brown dog' /dev/null {} +