`Grep` पर / खरीद और कच्चे डिस्क खराब होने के सटीक कारण क्या हैं?


9

मैं grep -r "searchphrase" /आज भागा और वह काम नहीं किया। मैंने कुछ शोध किया और find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"सही दृष्टिकोण पाया ।

मैं इकट्ठा /procऔर डिस्क की तरह /dev/sda1एक गैर सफल grep के लिए अपराधी हैं।

मुझे "क्यों" पर कुछ गहरी तकनीकी पृष्ठभूमि पसंद आएगी। मुझे लगता है कि /procट्रैवर्स किए जाने पर कुछ लिंक अनंत लूप बनाते हैं, और मैंने पढ़ा कि इसके और भी कारण हैं, लेकिन कुछ खास नहीं है।

इसके अलावा, क्या होता है जब एक कच्ची डिस्क को पकड़ लिया जाता है? क्या द्विआधारी डेटा (जो /dev/sda1मुझे पता है) पर उपलब्ध है? व्याख्या नहीं की जा सकती, क्योंकि केवल mountएक फाइलसिस्टम-प्रकार डिस्क से डेटा को बुद्धिमान बनाता है? क्या यह अभी भी एक बाइनरी स्ट्रिंग के लिए पकड़ना संभव होगा?

जवाबों:


11

हाँ, आप कर सकते हैं grep /dev/sda1और /procआप शायद नहीं चाहते हैं। विस्तृत रूप में:

  1. हाँ, आप बाइनरी सामग्री को चला सकते हैं /dev/sda1। लेकिन, आधुनिक बड़ी हार्ड डिस्क के साथ, इसमें बहुत लंबा समय लगेगा और परिणाम उपयोगी होने की संभावना नहीं है।

  2. हां, आप सामग्री को प्राप्त कर सकते हैं /procलेकिन इस बात से अवगत रहें कि आपके कंप्यूटर की मेमोरी वहां फाइलों के रूप में मैप की गई है। गीगाबाइट्स RAM के साथ एक आधुनिक कंप्यूटर पर, यह grep में एक लंबा समय लेगा और, फिर से, परिणाम उपयोगी होने की संभावना नहीं है।

अपवाद के रूप में, यदि आप एक क्षतिग्रस्त फ़ाइल सिस्टम के साथ हार्ड डिस्क पर डेटा की तलाश कर रहे हैं, तो आप grep something /dev/sda1फ़ाइल के डेटा को पुनर्प्राप्त करने के प्रयास के भाग के रूप में चला सकते हैं ।

में अन्य समस्याग्रस्त फाइलें /dev

हार्ड डिस्क और हार्ड डिस्क विभाजन के तहत किया /devजा सकता है, अगर किसी के पास पर्याप्त धैर्य है, तो पकड़ लिया। अन्य फाइलें (हैट टिप: user2313067 ), हालांकि, समस्याएँ पैदा कर सकती हैं:

  1. /dev/zeroअनंत लंबाई की एक फ़ाइल है। सौभाग्य से, grep(कम से कम GNU संस्करण) इसे छोड़ने के लिए पर्याप्त स्मार्ट है:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randomऔर /dev/urandomअनंत भी हैं। grep something /dev/randomजब तक grepरुकने का संकेत नहीं दिया जाता तब तक कमांड हमेशा के लिए चलेगा ।

    /dev/urandomपासवर्ड जनरेट करते समय यह उपयोगी हो सकता है । उदाहरण के लिए, पाँच यादृच्छिक वर्णमाला वर्ण:

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    यह अनंत नहीं है, क्योंकि इसमें पर्याप्त वर्ण प्राप्त करने के बाद, headपाइप को बंद कर देता है जिससे ग्रीप समाप्त हो जाता है।

अनंत छोरों

"... लिंक ... ट्रैवर्स किए जाने पर अनंत लूप बनाते हैं ..."

Grep (कम से कम GNU संस्करण) ऐसा नहीं करने के लिए पर्याप्त स्मार्ट है। आइए दो मामलों पर विचार करें:

  1. -rविकल्प के साथ , grep प्रतीकात्मक लिंक का पालन नहीं करता है जब तक कि वे स्पष्ट रूप से कमांड लाइन पर निर्दिष्ट नहीं होते हैं। इसलिए, अनंत लूप संभव नहीं हैं।

  2. -Rविकल्प के साथ , grep प्रतीकात्मक लिंक का पालन करता है , लेकिन यह उन्हें जाँचता है और लूप में पकड़े जाने से मना करता है। उदाहरण देकर स्पष्ट करने के लिए:

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

से समस्याग्रस्त निर्देशिकाओं को छोड़कर grep -r

एक तरफ के रूप में, grepकुछ फ़ाइलों या निर्देशिकाओं की खोज से grep को रोकने के लिए एक सीमित सुविधा प्रदान करता है। उदाहरण के लिए, आप निकाल सकते हैं सभी निर्देशिकाओं नामित proc, sysऔर devसाथ ग्रेप की पुनरावर्ती खोज से:

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

वैकल्पिक रूप से, हम बाहर कर सकते हैं proc, sysऔर devपार्टी के विस्तारित globs का उपयोग कर:

shopt -s extglob
grep -r something /!(proc|sys|dev)

धन्यवाद! यह बहुत अच्छा जवाब है। जब तक एक और नायक आज रात अंधेरे से बाहर नहीं निकलता मैं इसे कल स्वीकार करूंगा! मैं एक और बात के बारे में सोच रहा हूं, और मुझे आशा है कि यह बहुत दूर नहीं है: यदि उस grepफ़ाइल को खोजा जाता /procहै जिसमें मैप की गई मेमोरी होती है, तो क्या ऐसा हो सकता है कि grep(यादृच्छिक) मेमोरी के अंदर ईओएफ हिट हो , और निम्न डेटा को एक के रूप में व्याख्या करता है खोज करने के लिए नया नाम? मैंने grepसोर्स कोड पढ़ना शुरू कर दिया है , लेकिन मुझे लगता है कि मैं इसमें बहुत ज्यादा नहीं देखूंगा।
जिज्ञासु_वेदर

1
@krork कुछ पुराने ऑपरेटिंग सिस्टम में, जैसे CP / M, एक फ़ाइल के अंत में EOF चरित्र द्वारा संकेत दिया गया था। क्योंकि आधुनिक फ़ाइल सिस्टम एक फ़ाइल के आकार का ट्रैक रखता है, ऐसे वर्ण उपयोग से बाहर हो गए हैं।
जॉन 1024

2
ग्रीपिंग /devकभी भी समाप्त नहीं हो सकती क्योंकि ग्रीप स्कैन /dev/zeroया इसी तरह शुरू होता है । यदि ऐसी फाइलें मौजूद हैं /procया नहीं तो अनिश्चित करें /sys
user2313067

1
@ user2313067 अच्छी बात! जबकि GNU grep खोज करने से इंकार कर देगा /dev/zero, यह /dev/randomहमेशा के लिए खोज करेगा जब तक रोका नहीं जाता। उत्तर अपडेट किया गया।
जॉन १०२४२४ १४'१६

मैं / proc या sys के साथ बहुत कुछ नहीं करता, लेकिन चूंकि ये वर्चुअल निर्देशिकाएं हैं, जिन्हें किसी भी समय अपडेट किया जा सकता है, आपको कई रन से अप्रत्याशित / अप्राप्य परिणाम प्राप्त हो सकते हैं। बेशक, यह नियमित रूप से फाइल सिस्टम के साथ भी हो सकता है, लेकिन यह यहां थोड़ा अधिक आश्चर्यजनक हो सकता है।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.