2012-07-19 13 views
10

के लिए grep में परिणाम ढूंढने के लिए मैं उपनिर्देशिका "कैश" को छोड़कर, वर्तमान उपनिर्देशिका में सभी फ़ाइलों की सूची बनाने के लिए सफलतापूर्वक उपयोग कर रहा हूं।पाइपिंग फास्ट निर्देशिका बहिष्करण

find . -wholename './cach*' -prune -o -print 

अब मैं एक ग्रेप आदेश में पाइप यह करना चाहते हैं: यहाँ कोड की मेरी पहली बिट है। ऐसा लगता है कि यह सरल होना चाहिए:

find . -wholename './cach*' -prune -o -print | xargs grep -r -R -i "samson" 

... लेकिन यह परिणाम लौट रहा है जो ज्यादातर कैश निर्देशिका से हैं। मैंने xargs संदर्भ को हटाने का प्रयास किया है, लेकिन यह वही करता है जो आप उम्मीद करते हैं, फ़ाइलों के बजाय फ़ाइल नामों के पाठ पर grep चला रहे हैं। मेरा लक्ष्य किसी भी फाइल में "सैमसन" ढूंढना है जो कैश की गई सामग्री नहीं है।

मैं इस उदाहरण में दोगुनी पकड़ का उपयोग करके शायद इस मुद्दे को प्राप्त कर दूंगा, लेकिन मैं इस बारे में बहुत उत्सुक हूं कि यह एक-लाइनर इस तरह से क्यों व्यवहार करता है। इन दो आदेशों का उपयोग करते समय भी इसे संशोधित करने के तरीके पर विचारों को सुनना अच्छा लगेगा (क्योंकि इस तरह से करने के लिए गति के फायदे हैं)।

(यह, btw 5 CentOS में है।)

उत्तर

9

wholename मैच कारण है कि यह अभी भी "कैश" फ़ाइलों सहित है कारण हो सकता है। यदि आप निर्देशिका में find कमांड निष्पादित कर रहे हैं जिसमें "कैश" फ़ोल्डर है, तो इसे काम करना चाहिए। यदि नहीं, तो इसे इसके बजाय -name '*cache*' पर बदलने का प्रयास करें।

इसके अलावा, आप -r या -R अपने grep के लिए की जरूरत नहीं है, यह है कि यह बताता निर्देशिका के माध्यम से recurse करने - लेकिन आप अलग-अलग फ़ाइलों का परीक्षण कर रहे।

आप पाइप संस्करण, या एक एकल आदेश का उपयोग कर अपने आदेश को अद्यतन कर सकते हैं:

find . -name '*cache*' -prune -o -print0 | xargs -0 grep -il "samson" 

या

find . -name '*cache*' -prune -o -exec grep -iq "samson" {} \; -print 

ध्यान दें, पहले आदेश में -l बताता grep "फ़ाइल सूची "और रेखा से मेल नहीं खाते हैं। दूसरे में -q वही है; यह चुपचाप जवाब देने के लिए grep बताता है ताकि find फिर फ़ाइल नाम मुद्रित कर सके।

+0

धन्यवाद! रिकर्सन को हटाने के लिए मेरे लिए चाल क्या है। (पुरानी आदतों मुश्किल मर जाते हैं। संयोग से, कि मेरी ओर से एक गलत टाइप किया गया था, के रूप में मैं आमतौर पर "-r मैं मैं" का उपयोग करें, जो अनावश्यक प्रत्यावर्तन झंडे तुलना में बहुत अधिक समझ में आता है।) "Wholename" भाग ठीक था, चूंकि अवांछित उपनिर्देशिका वास्तव में वर्तमान निर्देशिका के मूल स्तर में है। तो यह अब है: 'पाते हैं। -wholename './cach*' -prune -ओ प्रिंट | xargs grep मैं मैं "सैमसन" ' – eternalnewb

+0

बहुत बढ़िया, खुशी है कि यह कुछ सरल =] – newfurniturey

3

-exec विकल्प का उपयोग पर बजाय उन्हें एक और आदेश के लिए पाइप का लगता है। वहां से आप सूचीबद्ध प्रत्येक फ़ाइल में सैमसन देखने के लिए grep "samson" {} \; का उपयोग कर सकते हैं।

उदाहरण के लिए:

find . -wholename './cach*' -prune -o -exec grep "samson" "{}" + 
3

आपने grep खुद को रिकर्स करने के लिए कहा है (दो बार! -r और -R समानार्थी हैं)। चूंकि आप जिन तर्कों को पारित कर रहे हैं उनमें से एक . (शीर्ष निर्देशिका) है, grep प्रत्येक फ़ाइल में खोज रहा है (उनमें से कुछ दो बार, या यदि वे उपनिर्देशिका में हैं तो भी अधिक)।

आप find और grep उपयोग करने के लिए जा रहे हैं, ऐसा करते हैं:

find . -path './cach*' -prune -o -print0 | xargs -0 grep -i "samson" 

-print0 और -0 का उपयोग करना भी फ़ाइल नाम है कि रिक्त स्थान या विराम चिह्न वर्ण हो के साथ अपनी स्क्रिप्ट काम में आता है।

grep -R --exclude-dir='cach*' -i "samson" . 

(यह भी ./deeply/nested/directory/cache शामिल नहीं आप केवल पर संचय निर्देशिकाओं बाहर करने के लिए करना चाहते हैं:।

हालांकि, आप शायद, यहाँ find साथ परेशान करने के लिए के बाद से जीएनयू ग्रेप को छोड़कर निर्देशिका करने में सक्षम है की जरूरत नहीं है उच्चस्तरीय, find का उपयोग के रूप में आप ऐसा किया।)

+0

अगर वहाँ वर्तमान फ़ोल्डर/रास्ते में बहुत सारी फ़ाइलें हैं था, एकल' grep' एक "बहुत सारे तर्क" त्रुटि वापस आ जाएगी - तो आपको इसके साथ सावधान रहना होगा। – newfurniturey

+0

इस पकड़ने के लिए धन्यवाद! जैसा कि "स्वीकृत" उत्तर में उल्लिखित है, तुरंत उस निश्चित चीजों को साफ कर रहा है। तुम लोग महान हो – eternalnewb

+0

@ न्यूवेर्फीनी नहीं, शेल से बहुत "तर्क" त्रुटि आती है, अगर कमांड लाइन बहुत लंबी थी (उदा। अगर मैं 'grep ... *' लिखा था और वहां बहुत सारी फाइलें थीं)। यहां कोई खोल ग्लोबिंग नहीं है, कमांड लाइन बिल्कुल 43 वर्ण है। – Gilles

संबंधित मुद्दे