कैसे एक निर्देशिका में सभी फाइलों पर grep संचालन करते हैं


219

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

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

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

जवाबों:


228

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


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

1
मैं कई एक्सटेंशन कैसे शामिल करूं? उदाहरण के लिए। * ".cpp", "* .h"?
टॉम ज़ातो -

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

अगर मैं रन करता हूं तो grep -r x .परिणाम सभी एक्सटेंशन की सभी फाइलों से आते हैं। यदि मैं दौड़ता हूं grep -r x *.scssतो मुझे कोई परिणाम नहीं मिलता है।
क्रिस

1
@ यह संभव है कि आपके पास *.scssवर्तमान निर्देशिका में फाइलें न हों, लेकिन उपखंडों में कहीं अधिक गहरी तो जीआरपी उन सभी फाइलों में नहीं दिखती है जो आप चाहते थे। आपको --includeविशिष्ट पैटर्न से मेल खाने वाली फ़ाइलों के लिए पुनरावर्ती रूप से देखने के लिए grep को बताने के लिए विकल्प का उपयोग करना चाहिए : grep -r x --include '*.scss' . (उद्धरण ध्यान दें, वे पैटर्न को शेल द्वारा विस्तारित होने से रोकते हैं)। या बस उपयोग करें find(रोब का जवाब देखें)।
umi

169

लिनक्स में, मैं आम तौर पर इस कमांड का उपयोग एक विशेष पाठ के लिए संक्षिप्त रूप से संक्षिप्त विवरण के लिए करता हूं

grep -rni "string" *

कहाँ पे,

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


32

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

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

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


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

2
यह कैसा दिखेगा? मैं हमेशा xargsवाक्यविन्यास भूल जाता हूं ।
ब्रायन पीटरसन

3
@BrianPeterson यह कुछ इस तरह होगा:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince

4

सभी उप-निर्देशिकाओं में खोज करने के लिए, लेकिन केवल विशिष्ट फ़ाइल प्रकारों में , grep का उपयोग करें --include

उदाहरण के लिए, * .yml और * .yaml में पाठ के लिए वर्तमान निर्देशिका में पुनरावर्ती खोज।

grep "text to search" -r . --include=*.{yml,yaml}

1

यदि आप कई कमांड करना चाहते हैं, तो आप उपयोग कर सकते हैं:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.