पुनरावर्ती फ़ोल्डर खोजें, लेकिन svn सबफ़ोल्डर को बाहर करें


10

मैं fooSVN द्वारा बनाए एक बड़े फ़ाइल सिस्टम में सभी घटनाओं को ढूंढना चाहता हूं, लेकिन मैं किसी भी .svnनिर्देशिका में निहित किसी भी चीज़ से मेल नहीं खाना चाहता ।

जब मैं करता हूं तो मुझे तत्काल मैच मिल जाते हैं, grep -l -e 'foo' *लेकिन जब मैं कोशिश करता हूं और grep -l -e 'foo' --exclude-dir=".svn"कमांड के साथ svn डाइरेक्टरी को छोड़ देता हूं तो बस लटक जाता है।

मैं क्या गलत कर रहा हूं?

जवाबों:


11

--exclude-dirकमांड लाइन पर फ़ाइलों को सूचीबद्ध करने की आवश्यकता को नहीं दबाता है। आप "फांसी" कर रहे हैं क्योंकि grepमानक इनपुट की प्रतीक्षा है।

grep -l -e 'foo' --exclude-dir = "। svn" *

Ack का उपयोग करने पर विचार करें , जो .svnडिफ़ॉल्ट रूप से फ़ोल्डर और समान फ़ोल्डर (और कई अन्य विशेषताएं हैं) को शामिल करता है।


2
क्लीनर अगर आप को बदलने *के लिए ., मामले में अन्य छिपे फ़ोल्डर कि खोजा जाना चाहिए।
केविन

या शायद आप --recursive .इसके बजाय उपयोग करना चाहते हैं , क्योंकि ओपी के पास पहले से ही जीएनयू है grep
jw013

व्यक्तिगत रूप से, मेरे पास shopt -s dotglobबैश में है, इसलिए *पहले से ही डॉट-फाइलें हैं। -rअच्छा है, लेकिन ackक्या यह डिफ़ॉल्ट रूप से भी है
17

5

आपको एकेक में दिलचस्पी हो सकती है । यह पुनरावर्ती खोज (और अन्य ग्रेप की तरह परिचालन) जैसे, और शामिल नहीं निर्देशिकाओं करता .svn या .git डिफ़ॉल्ट रूप से।


इस पर एक अनुवर्ती के रूप में, मैं वर्तमान में उपयोग करता हूं ag, जो समान है, लेकिन तेज है।
WhyNotHugo

2

grep --exclude-dir...समाधान ठीक होना चाहिए, लेकिन सिर्फ एक और रास्ता दिखाने के लिए, आप के साथ ऐसा कर सकते हैं findकी -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

यदि आप कुछ और आगे बढ़ाना चाहते हैं, findतो एक सादे से बेहतर है grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

यदि आप .svn कभी निर्देशिका में नहीं जाना चाहते हैं, तो आप $GREP_OPTIONSइसे नीचे के रूप में बाहर करने के लिए चर सेट कर सकते हैं:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

बस इस पंक्ति को अपने .bashrcऔर अपने पुनरावर्ती greps में जोड़ें और अधिक .svnनिर्देशिकाओं में प्रवेश नहीं करेंगे । बेशक, यह उतना ही समृद्ध हो सकता है जितना आप चाहते हैं:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
मैं व्यक्तिगत रूप से एक उपनाम का उपयोग कर रहा हूं ताकि मैं बहिष्करण सूची को बायपास कर सकूं अगर मुझे वास्तव में उन फ़ोल्डरों के अंदर खोज करने की आवश्यकता है जो मैं बस नंगे जीआरपी का उपयोग कर सकता हूं बिना वेरिएबल को अनसेट / शून्य किए बिना। यह मुझे उन फ़ोल्डरों की एक सूची बनाए रखने देता है, जिन्हें मैं आसानी से विस्तारित कर सकता हूं और अधिक टाइपिंग किए बिना अपने आप बहिष्करणों की सूची में जोड़ सकता हूं।
ड्रैगन 788

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

0

यहाँ एक अजीब समाधान है:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

मूल रूप से, सभी फ़ाइलों से, जो उस मैच को prun करते हैं / ssv/ और फिर, उनमें से, केवल उन लोगों को प्रिंट करें जो मैच / foo / करते हैं। मुझे यह समाधान भी पसंद है क्योंकि आप आसानी से एलएस के साथ परिणामों का उपयोग कर सकते हैं। उदाहरण के लिए, आप उपयोग कर सकते हैं

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

संशोधन दिनांक द्वारा क्रमबद्ध सूची दृश्य देखने के लिए। इसके अलावा, यदि आप उनके साथ कुछ और करना चाहते हैं (तो उन्हें खोलें, निष्पादित करें, आदि) परिणामों का पूरा पथ होना अच्छा है।

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