मैं कई अनावश्यक निर्देशिकाओं को खोजने के लिए grep का उपयोग कैसे कर सकता हूं?


21

यह लग सकता है कि मैं इस प्रश्न के समान बात पूछ रहा हूं , लेकिन मेरी अलग आवश्यकताएं हैं। यह मेरे फाइलसिस्टम का एक उदाहरण है:

  • / कोड /
    • अंदर का/
      • देव /
      • मुख्य/
    • जनता/
      • देव /
      • मुख्य/
      • जारी /
    • उपकरण /

/code/internal/dev/, /code/public/dev/और /code/tools/कई परियोजनाओं के लिए उपनिर्देशिका शामिल हैं। मैं के देव शाखाओं में लगभग विशेष रूप से काम करते हैं /code/internal/और /code/public/है, और अक्सर मैं के साथ-साथ उन निर्देशिकाओं में एक पाठ स्ट्रिंग के लिए खोज करना चाहते हैं /code/tools/(जो कोई शाखाएं हैं)। इन उदाहरणों में मुझे तीन अलग-अलग कमांड करने होंगे:

$ grep -r "some string" /code/internal/dev/
$ grep -r "some string" /code/public/dev/
$ grep -r "some string" /code/tools/

मैं जानना चाहता हूं कि क्या ऐसा करने के लिए एक ही आदेश है। यदि नहीं, तो मुझे एक साधारण बैश स्क्रिप्ट लिखने की आवश्यकता होगी।

जवाबों:


38

आप grep को देखने के लिए कई रास्ते बना सकते हैं:

grep -r "some string" /code/internal/dev/ /code/public/dev/ /code/tools/

यह तो स्पष्ट है। मैंने ऐसा क्यों नहीं सोचा ?!
डेविड कैनेडी

वास्तव में, यह एक त्रुटि फेंकता है grep: /code/internal/dev/*.cs: No such file or directoryजब तक कि मैं *.csकमांड से नहीं हटाता । यह मेरी गलती है क्योंकि मैंने *.csअपने प्रश्न को मूल रूप से रखा है।
डेविड कैनेडी

14

यदि आप वाइल्डकार्ड (और आपके द्वारा पोस्ट किया गया पदानुक्रम पूरा हो गया है) का अधिकतम उपयोग करना चाहते हैं, तो आप कर सकते हैं

grep -r "some string" /code/{*/dev,tools}/*.cs

स्पष्टीकरण:

पहले चरण में किया गया लट सूची का विस्तार है। foo{bar,baz}quxतक फैलता है foobarqux foobazqux। यही है, सूची में प्रत्येक अल्पविराम से अलग आइटम के लिए उत्पन्न एक अलग शब्द है, प्रत्येक के साथ उपसर्ग और उपसर्ग भाग जुड़ा हुआ है। आप देख सकते हैं कि कैसे काम करता है

echo A{1,2,3,4}B

जो आउटपुट देता है

A1B A2B A3B A4B

ध्यान दें कि यह कई ब्रेसिज़ के साथ भी काम करता है, और खाली तर्कों के साथ भी; उदाहरण के लिए

echo {,1,2}{0,1,2}:{2,3}

देता है

0:2 0:3 1:2 1:3 2:2 2:3 10:2 10:3 11:2 11:3 12:2 12:3 20:2 20:3 21:2 21:3 22:2 22:3

ब्रेस विस्तार के बाद, आपकी कमांड इस तरह दिखती है:

grep -r "some string" /code/*/dev/*.cs /code/tools/*.cs

अगला चरण वाइल्डकार्ड विस्तार है। आप पहले से ही जानते हैं कि *.csभाग के लिए, लेकिन यह मध्यवर्ती निर्देशिकाओं के लिए भी काम करता है; इसके अलावा, यदि कोई /अनुसरण करता है, तो केवल निर्देशिकाओं का मिलान किया जाता है। इसलिए आपकी पदानुक्रम (और .csफ़ाइलों के लिए फ़ाइल नाम बनाना ) को देखते हुए, आपको कमांड मिलेगी:

grep -r "some string" /code/internal/dev/file1.cs /code/internal/dev/file2.cs /code/public/dev/file3.cs /code/tools/file4.cs /code/tools/file5.cs

यह सब होने के बाद ही, grepतर्कों की इस सूची के साथ कहा जाता है (ध्यान दें कि आपके मूल आदेशों के साथ भी ऐसा ही होता है; grepकभी भी देखने के लिए नहीं *; विस्तार जो पूरी तरह bashसे कॉल करने से पहले किया जाता है grep)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.