ग्रीप, चेतावनियों को नजरअंदाज करें


50

मैं एक विशेष पैकेज की स्थापना निर्देशिका खोजने की कोशिश कर रहा हूं। मेरे पास एक निश्चित कीवर्ड है जिसका उपयोग करके मैं किसी विशेष फ़ाइल को खोजने का प्रयास कर रहा हूं।

Grep के दौरान, मैं केवल cpp या h फ़ाइल प्रकार को शामिल करना चाहता हूं । मैं नहीं चाहता कि grep अनुमति अस्वीकार की तरह चेतावनी दिखाए या निर्देशिका नहीं मिली । मैं सिर्फ यह चाहता हूं कि मिलान वाली फाइलें प्रदर्शित करें, और कुछ नहीं। कृपया सुझाव दें कि मैं यह कैसे कर सकता हूं?

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

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

जवाबों:


56

उन चेतावनियों को stderrस्ट्रीम में निर्देशित किया जाता है, जैसा कि मानक आउट फाइल डिस्क्रिप्टर के विपरीत है। आप 2>/dev/nullअपने आदेश के अंत में जोड़कर stderr आउटपुट को चुप कर सकते हैं ।


Te अधिक विशिष्ट हो सकता find . 2>/dev/null | grep 404.htmlहै कि एक कमांड कैसा दिखेगा
csga5000

30

चेतावनियों को फ़िल्टर करने से अधिक सीधे आप उन्हें जोड़कर अक्षम कर सकते हैं -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

इस विकल्प के साथ कुछ संगतता मुद्दे हैं। हालाँकि, यह व्यक्तिगत उपयोग के लिए एक समस्या नहीं होनी चाहिए।

-s, --no- संदेश: कोई भी नहीं या बिना पढ़े फ़ाइलों के बारे में त्रुटि संदेशों को दबाएं। पोर्टेबिलिटी नोट: GNU grep के विपरीत, 7th संस्करण Unix grep POSIX के अनुरूप नहीं था, क्योंकि इसमें -q का अभाव था और इसका विकल्प GNU grep -q विकल्प की तरह व्यवहार करता था। USG- शैली grep में -q का भी अभाव है, लेकिन इसका विकल्प GNU grep की तरह व्यवहार करता है। पोर्टेबल शेल स्क्रिप्ट को -q और -s दोनों से बचना चाहिए और इसके बजाय मानक और त्रुटि आउटपुट को / dev / null में रीडायरेक्ट करना चाहिए। -s POSIX द्वारा निर्दिष्ट किया गया है।)


मैंने अभी 13.04 स्थापित किया है और मुझे वे त्रुटियाँ मिल रही हैं जो मुझे 12.04 के साथ नहीं मिल रही थीं। क्या ऐसा हो सकता है कि कुछ बदला हो? मैंने सोचा था कि यह अच्छा था कि grep उन फाइलों के बारे में चेतावनी देना बंद कर देता है, क्योंकि ज्यादातर मामलों में मुझे परवाह नहीं है!
एलेक्सिस विलके

क्षमा करें, मैं अभी भी 12.10 पर हूं, इसलिए मैं इसकी पुष्टि नहीं कर सकता।
सेबस्टियन वोम मीर

5

मुझे इस तरह के एक टन कष्टप्रद संदेश मिलते थे:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

कारण यह है कि --directoriesध्वज को डिफ़ॉल्ट किया गया है read। मैंने इसे बदल दिया recurse; यदि आप नहीं चाहते हैं कि यह स्वचालित रूप से एक पुनरावर्ती खोज कर सके जो आप skipइसके बजाय उपयोग कर सकते हैं ।

हर समय इसे संभालने का सबसे आसान तरीका है कि इसे पर्यावरण चर में सेट किया जाए। में ~/.bash_profileया ~/.bashrcअपने distro पर निर्भर करता है:

export GREP_OPTIONS='--directories=recurse'

अब यह स्वचालित रूप से उन संदेशों को दबा देता है जब भी मैं grep का उपयोग करता हूं।

एक अन्य विकल्प --no-messagesझंडा, आशुलिपि है -s। इससे Is a directoryसंदेशों से छुटकारा भी मिल जाएगा , लेकिन यह अन्य संदेशों को भी दबा देता है जो अधिक उपयोगी हो सकते हैं। उदाहरण के लिए, यदि आप एक नेस्टेड खोज कर रहे हैं */*/*और उस पैटर्न की ऐसी कोई फ़ाइल मौजूद नहीं है, तो यह आपको यह नहीं बताएगा।


अच्छी खोज
aldr

1

इसके बजाय वैकल्पिक रूप से grepपुनरावृत्ति करने के बजाय वैकल्पिक आज्ञा -ir देना होगा find(जो कि डिफ़ॉल्ट रूप से पुनरावर्ती है) -readableझंडे के साथ अनुमतियों को संभालना और -not -path "*.svn*"झंडे के साथ बाहर करना , और फिर फ़ाइल को पास करना grep। निर्देशिका को छोड़कर -type fकेवल नियमित फ़ाइलों को खोजने के लिए किया जाता है ।

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

0

विशिष्ट फ़ाइलों में पुनरावर्ती खोज करते समय, आप का उपयोग करना बेहतर होता है ack-grep। यहाँ सिंटैक्स होगा:

ack-grep -i "My term" --cpp --h

अनुमति त्रुटि संदेशों को हटाने के लिए, आप उसी आदेश को चलाना चाह सकते हैं sudo:

ack-grep -i "My term" --cpp --h

लेकिन अंत में, यदि आप स्थापित पैकेजों को खोजना चाहते हैं, तो उन विभिन्न विकल्पों को देखें: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

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