मुझे यकीन नहीं है:
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 {} +