पूरे फाइल सिस्टम में टेक्स्ट कैसे खोजें?


53

यह मानते हुए कि grep उपकरण का उपयोग किया जाना चाहिए, मैं संपूर्ण फ़ाइल सिस्टम में पाठ स्ट्रिंग "800x600" की खोज करना चाहता हूं।

मैंने कोशिश की:

grep -r 800x600 /

लेकिन यह काम नहीं करता है।

मेरा मानना ​​है कि मेरे आदेश को पाठ "800x600" के लिए रूट के तहत सभी फ़ाइलों / फ़ोल्डरों के माध्यम से पुन: प्राप्त करना चाहिए और खोज परिणामों को सूचीबद्ध करना चाहिए।

मैं क्या गलत कर रहा हूं?


2
और "यह काम नहीं करता है" से आप वास्तव में क्या मतलब है? क्या यह किसी भी आउटपुट को प्रिंट नहीं करता है, बहुत सारी Permission deniedत्रुटियों को लटकाता है या प्रिंट करता है ? क्या आपने इसे रूट या सामान्य उपयोगकर्ता के रूप में चलाया?
एलेक्स

मुझे कुछ कर्षण मिल रहा है, सबसे पहले मैं अपने उपयोगकर्ता होम डायरेक्टरी में कमांड चलाने की कोशिश कर रहा था। तो अब मैं सीडी / रूट करने के लिए बाहर है। आगे मैंने ऊपर की तरह ही कमांड की कोशिश की और मुझे बहुत सारी परमिशन से वंचित त्रुटियां हो रही हैं। ठीक है, तो अब मैं sudo grep -r 800x600 / की कोशिश करता हूं और फिर मुझे एक / proc / sysrq-ट्रिगर मिलता है: इनपुट / आउटपुट त्रुटि
Level1Coder

हम्म, पता नहीं क्यों यह काम नहीं करेगा। आप कर त्रुटियों को अनदेखा कर सकते हैं grep -r 800x600 / 2>/dev/null। आप इसे रूट के रूप में चलाने का भी प्रयास कर सकते हैं।
टोटन

जवाबों:


64

मैं सामान्य रूप grepसे कई फाइलों को चलाने के लिए कमांड की इस शैली का उपयोग करता हूं :

find / -xdev -type f -print0 | xargs -0 grep -H "800x600"

यह वास्तव में क्या करता है सिस्टम पर प्रत्येक फ़ाइल की एक सूची बनाता है, और फिर प्रत्येक फ़ाइल के लिए, grepदिए गए तर्कों और प्रत्येक फ़ाइल के नाम के साथ निष्पादित करें।

-xdevतर्क कहता है लगता है कि यह अन्य फ़ाइल सिस्टम को नजरअंदाज करना होगा - यह इस तरह के रूप में विशेष फ़ाइल सिस्टम से बचने के लिए अच्छा है /proc। हालाँकि, यह सामान्य फाइल सिस्टम को भी नजरअंदाज कर देगा - इसलिए यदि, उदाहरण के लिए, आपका / होम फोल्डर एक अलग विभाजन पर है, तो इसे खोजा नहीं जाएगा - आपको कहना होगा find / /home -xdev ...

-type fइसका मतलब केवल फाइलों के लिए खोज करना है, इसलिए निर्देशिकाओं, उपकरणों और अन्य विशेष फ़ाइलों को अनदेखा किया जाता है (यह अभी भी निर्देशिकाओं में फिर से आ जाएगी और grepफाइलों grepपर निष्पादित करेगा - यह केवल निर्देशिका पर ही निष्पादित नहीं करेगा , जो वैसे भी काम नहीं करेगा)। और -Hविकल्प grepयह बताता है कि इसके आउटपुट में फाइलनाम को हमेशा प्रिंट करें।

findफ़ाइलों की सूची को फ़िल्टर करने के लिए सभी प्रकार के विकल्पों को स्वीकार करता है। उदाहरण के लिए, -name '*.txt'केवल .txt में समाप्त होने वाली फ़ाइलों को संसाधित करता है। -size -2Mफ़ाइलों का मतलब है कि 2 मेगाबाइट से छोटी हैं। -mtime -5पिछले पांच दिनों में संशोधित फाइलें। के लिए और -o के लिए -a के साथ या , और समूह अभिव्यक्तियों के लिए '('कोष्ठकों ')'का उपयोग करें (उद्धरण में उन्हें व्याख्या करने से रोकने के लिए) के साथ एक साथ शामिल हों । उदाहरण के लिए:

find / -xdev '(' -type f -a -name '*.txt' -a -size -2M -a -mtime -5 ')' -print0 | xargs -0 grep -H "800x600"

man findसंभावित फ़िल्टर की पूरी सूची देखने के लिए एक नज़र डालें ।


2
ध्यान दें कि केवल अन्य विशेष -xdevको छोड़कर सभी अन्य फाइल सिस्टम को बाहर करेगा । (उदाहरण के लिए, यदि आपने /homeएक अलग विभाजन के रूप में माउंट किया है, तो इसे खोजा नहीं जाएगा।)
cjm

मैं हर एक को चलाने की कोशिश की, लेकिन दोनों एक त्रुटिfind: paths must precede expression: /
Level1Coder

1
नोट: जब नियमित अभिव्यक्तियों की आवश्यकता नहीं होती है तो 'frerep' 'grep' की तुलना में काफी तेज होता है, जो कि एक बड़े पेड़ की खोज करने पर एक बड़ा बदलाव लाएगा।
नाथन किड

1
आप xargsऐसा करके शायद बेहतर दक्षता के साथ जाने से बच सकते हैं find / -xdev -type f -exec grep -H '800x600' +
टॉटर

3
नहीं, कमांड +के अंत में संकेत findवास्तव में ऐसा ही करता है xargs: यह grepकई तर्कों के साथ एक प्रक्रिया को जन्म देता है।
टोटर

14

आम तौर पर आप वास्तव में सिस्टम पर हर किसी को खोजना नहीं चाहेंगे। लिनक्स सब कुछ के लिए फ़ाइल नोड्स का उपयोग करता है, इसलिए कुछ "फाइलें" ऐसी चीजें नहीं हैं जिन्हें आप खोजना चाहते हैं। उदाहरण के /dev/sdaलिए आपकी पहली हार्ड ड्राइव के लिए भौतिक ब्लॉक डिवाइस है। आप शायद कच्ची डिस्क डिवाइस नहीं माउंटेड फ़ाइल सिस्टम को खोजना चाहते हैं। इसके अलावा /dev/randomहर बार पढ़ते समय रैंडम डेटा खर्च होता है। खोज है कि बहुत मतलब नहीं है। /procफाइल सिस्टम भी अपने मामले में समस्याग्रस्त है।

मैं दो चीजों में से एक को फिर से शामिल करूँगा।

  1. रूट पर खोज न करें, केवल उन स्थानों को खोजें जो उपयोगी हो सकते हैं। खोजें /homeया /usrया /etcseparatly। आप जिस जानकारी की तलाश कर रहे हैं वह एक विशिष्ट प्रकार की होने की संभावना है, इसलिए यह वैसे भी एक विशिष्ट फ़ोल्डर में होने की संभावना है। कॉन्फ़िगरेशन सेटिंग्स में होना चाहिए /etc। आपकी व्यक्तिगत डेटा फाइलें अंदर होनी चाहिए /home। इस तरह एक प्रमुख क्षेत्र में खोज सीमित करने से पुनरावर्ती greps के साथ आपकी समस्याएं कम हो जाएंगी।

  2. समस्याग्रस्त क्षेत्रों का उपयोग करना --exclude-dirऔर उन चीजों का एक समूह को छोड़ दें जिन्हें आप जानते हैं कि आपको इसकी आवश्यकता नहीं है:
    grep -r --exclude-dir /proc --exclude-dir /dev --exclude-dir /tmp --exclude-dir /lost+found

अंत में, बड़ी पुनरावर्ती grep करते समय कुछ 'अनुमति-अस्वीकृत' त्रुटियों को चलाना असामान्य नहीं है। उपयोग के सामान्य कोर्स में ऐसी फाइलें हैं जिन्हें आपका उपयोगकर्ता पढ़ने में सक्षम नहीं हो सकता है। जब तक ये सिर्फ कुछ अजीब फाइलें हैं और आपके हार्ड ड्राइव या पूरे खरीद फाइल सिस्टम के लिए रॉ डिवाइस जैसी चीजें नहीं हैं, बस त्रुटियों को अनदेखा करना ठीक है। वास्तव में आप कमांड लाइन पर यह कर सकते हैं कि सभी त्रुटियों को कभी भी भूमि पर न भेजें:

grep -r search_string /path 2> /dev/null

3
-Iबाइनरी को बाहर करने के लिए
राहुल पाटिल

2

सादगी के लिए, मैं ack-grep का सुझाव दूंगाack-grepबेहतर विकल्प होने पर लिंक कई मामलों को दिखाता है।

स्थापित करने के बाद, उपयोग करने के लिए:

ack-grep pattern /

यह सिफारिश करने के लिए धन्यवाद, लेकिन मैंने इसे चलाया और यह वास्तव में मुझे वह खोज परिणाम नहीं दे पाया जिसकी मुझे आशा थी। ऐसा लगता है कि मुझे जो चाहिए उसे पाने के लिए मुझे कई सेटिंग्स को बदलना होगा। अब के रूप में रिचर्ड का जवाब सही बॉक्स से बाहर काम करता है। भविष्य में इस पर गौर करेंगे क्योंकि यह उपयोगी भी लगता है।
Level1Coder

1

इसे देखने का एक और तरीका है:

grep -r /* | grep "800x600"

0

* तब मुझे एक / proc / sysrq-ट्रिगर मिलता है: इनपुट / आउटपुट त्रुटि

आपकी कमांड काम कर रही है आपको यह त्रुटि मिल रही है क्योंकि आप एक स्ट्रिंग के लिए रनिंग प्रक्रियाओं को स्कैन करने की कोशिश कर रहे हैं।

मैं सिस्टम निर्देशिकाओं को बाहर करने की सलाह देता हूं

grep -exclude-dir = {proc, sys} "800x600" /


-3

बस सही-

grep -r "800x600" /

-क्या आपके वर्तमान कमांड में गलत है उद्धरण, ""। हमेशा स्ट्रिंग तर्क को grepउद्धरणों में रखें।


3
यह यहां की समस्या नहीं है। इस विशेष प्रकार के तर्क को देते समय आपको उद्धरण चिह्नों की आवश्यकता नहीं है grep। इसे आज़माएँ और आप देखेंगे। स्ट्रिंग "800x600" को एक फ़ाइल में रखें और फिर grep 800x600 fileआप देखेंगे कि यह ठीक काम करता है। ओपी स्पष्ट रूप से कुछ अन्य मुद्दा रहा है।
SLM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.