2013-03-08 5 views
110

xenserver के साथ काम करना, और मैं निर्देशिका में मौजूद प्रत्येक फ़ाइल पर एक कमांड करना चाहता हूं, कमांड के आउटपुट से कुछ सामान निकालकर फ़ाइल में जोड़ना चाहता हूं।निर्देशिका में सभी फ़ाइलों पर grep ऑपरेशन कैसे करें

मैं उस आदेश पर स्पष्ट हूं जिसे मैं उपयोग करना चाहता हूं और स्ट्रिंग (ओं) को आवश्यकतानुसार कैसे तैयार करना है।

लेकिन जो मैं स्पष्ट नहीं हूं, यह है कि मैं प्रत्येक फ़ाइल पर यह आदेश कैसे करूं, अगली बार जा रहा हूं, जब तक कि कोई और फाइल न मिल जाए।

उत्तर

58

लिनक्स में, मैं आम तौर पर इस आदेश का उपयोग रिकर्सिवली, एक निर्देशिका

grep -rni "string" * 

जहां के भीतर एक विशेष पाठ के लिए grep को

r = पुनरावर्ती यानी, वर्तमान निर्देशिका के भीतर खोज उपनिर्देशिका
एन =
i = केस असंवेदनशील खोज

132

grep $PATTERN * पर्याप्त संख्या के लिए लाइन संख्याओं को मुद्रित करने के लिए। डिफ़ॉल्ट रूप से, grep सभी उपनिर्देशिकाओं को छोड़ देगा। हालांकि, अगर आप उनके माध्यम से grep करना चाहते हैं, grep -r $PATTERN * मामला है।

+22

"grep -r $ पैटर्न।" काफी है। रिकर्सिव grep के लिए आपको सभी फ़ाइलों को निर्दिष्ट करने की आवश्यकता नहीं है – Cougar

+1

मैं एकाधिक एक्सटेंशन कैसे शामिल करूं? उदाहरण के लिए। "\ *। सीपीपी", "\ *। एच"? –

+1

@ टॉमस ज़ेटो, बस *: 'grep $ pATTERN * .cpp * .h' के बजाय अपने सभी फ़ाइल पैटर्न की आपूर्ति करें। यदि आपको फ़ाइलों को grepped के लिए अधिक विशिष्ट नियमों की आवश्यकता है, तो 'find' कमांड का उपयोग करें (रॉब का उत्तर देखें)। – umi

21

ढूंढें का उपयोग करें। गंभीरता से, यह सबसे अच्छा तरीका है क्योंकि तब आप वास्तव में देख सकते हैं कि फ़ाइलों को इस पर काम कर रहा है:

find . -name "*.sql" -exec grep -H "slow" {} \; 

ध्यान दें, एच मैक-विशिष्ट है, यह परिणामों में फ़ाइल नाम को दर्शाता है।

+5

यदि आप खोज का उपयोग करने का निर्णय लेते हैं, तो '-exec' का उपयोग करने के बजाय आउटपुट को' xargs' के माध्यम से पाइप करें, यह * बहुत तेज़ होगा, क्योंकि '-exec' प्रत्येक grep के लिए एक नई प्रक्रिया को जन्म देता है, और ओवरहेड एक महत्वपूर्ण के साथ महत्वपूर्ण हो जाता है बड़ी संख्या में फाइलें। फ़ाइल नामों में रिक्त स्थान के बारे में मानक चेतावनियां 'xargs' पर लागू होती हैं। –

+2

यह वास्तव में कैसा दिखता है? मैं हमेशा 'xargs' वाक्यविन्यास भूल जाता हूं। –

+1

@BrianPeterson यह ऐसा कुछ होगा: 'ढूंढें। -नाम "* .sql" -print0 | xargs -0 grep "धीमा" ' – MediaVince

2

आप एक से अधिक आदेशों क्या करना चाहते हैं, तो आप इस्तेमाल कर सकते हैं:

for I in `ls *.sql` 
do 
    grep "foo" $I >> foo.log 
    grep "bar" $I >> bar.log 
done 
संबंधित मुद्दे