Grep -r से छिपी उपनिर्देशिकाओं को बाहर करें


22

मेरे पास एक svn स्थानीय प्रति है, मैं स्ट्रिंग some_string पर एक खोज करना चाहता हूं।

$ grep some_string * -r
lang/en:some_string=Some string
lang/.svn/en:some_string=Some string

लेकिन अगर थोड़ा और आगे बढ़ें, तो ऐसा लगता है कि पहले स्तर की छिपी निर्देशिकाओं को बाहर रखा गया है:

$ cd lang && grep some_string * -r
en:some_string=Some string

मैं अपने आउटपुट से छिपे हुए svn diretories को कैसे निकाल सकता हूं, और न केवल पहली गहराई के स्तर से?

$ grep some_string * -r --which_option_here?
lang/en:some_string=Some string

एक सीधा जवाब नहीं है, लेकिन आप ack की कोशिश कर सकते हैं ।
प्रतिवेदित करें

जवाबों:


21

उपयोग --exclude-dirविकल्प, उदाहरण के लिए:

grep -r --exclude-dir='.*' some_string

से man grep:

--exclude-dir=DIR
              Exclude directories matching the pattern DIR from recursive searches.

हालाँकि, यह --exclude-dirविकल्प केवल GNU ग्रिप में उपलब्ध है। यदि आपका grepसमर्थन नहीं करता है, तो आपको उदाहरण के लिए अन्य उपकरण का उपयोग करने की आवश्यकता हो सकती है :

find . \( -name .svn -prune \) -o -name "*" -exec grep -H "some_string" {} 2>/dev/null \;

मेरे पास बहुत पुराना लिनक्स होना चाहिए ...
MUY बेल्जियम

मैंने उत्तर संपादित कर लिया है, findतो संस्करण का प्रयास करें यदि आपका grep समर्थन नहीं करता है --exclude-dir
जिमीज

मेरे पास संस्करण grep संस्करण 2.5.1 है, और कोई --exclude-dir तर्क नहीं है, और मैंने जो कुछ भी सोचा है उसकी कोशिश की है ...
MUY बेल्जियम

1
दूसरा समाधान उपयोग नहीं करता है --exclude-dir, क्या आपने इसे आज़माया है?
जिमीज

मेरे पास "अपरिवर्तित विकल्प" है
MUY बेल्जियम

1

मैं सामान्य रूप से इसका उपयोग करता हूं:

for e in $(find . -maxdepth 1 -type d); do echo ${e#\./}; done | grep -v '^\.'

${e%\./}पहले हटा देगा ./और फिर grepएक डॉट के साथ शुरू होने वाली हर चीज को हटा देगा।


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