मेरे पास 'ऐसी कोई फ़ाइल या निर्देशिका नहीं' त्रुटियां प्रिंट करने का तरीका कैसे हो सकता है?


215

मैं git द्वारा प्रबंधित कोड के एक बड़े ढेर के माध्यम से पकड़ रहा हूँ, और जब भी मैं एक grep करता हूं, मुझे प्रपत्र के संदेशों के ढेर और ढेर दिखाई देते हैं:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

क्या कोई रास्ता है जिससे मैं उन लाइनों को दूर कर सकूं?


1
इन दिनों मैं उपयोग करने की सलाह दूंगा ag, ackया cgrepइसके बजाय - वे grepकोड रिपोजिटरी खोजने के लिए बहुत तेज़ / बेहतर हैं ।
17

यदि आप कोड के माध्यम से पकड़ रहे हैं और विशेष निर्देशिकाओं से बचने के लिए देख रहे हैं, तो शायद आपको ऐक देखना चाहिए। यह एक स्रोत-कोड जागरूक grep है, और इस तरह के रूप में इस तरह के VCS निर्देशिका (साथ ही vi और emacs बैकअप, गैर-स्रोत फ़ाइलें आदि) को सक्रिय रूप से अनदेखा करेगा।
ब्रायन एग्न्यू

2
कोई उपयोगकर्ता No such file or directoryफ़ाइलों और / या निर्देशिकाओं के लिए संदेश कैसे प्राप्त कर सकता है? या, इसके विपरीत, grep *फ़ाइलों का नाम कैसे हो सकता है जो मौजूद नहीं हैं? क्या यह एक दौड़ की स्थिति है, जहां कुछ अन्य प्रक्रिया निर्देशिका ट्री को जोड़ रही है ( grepजो चल रही है , फ़ाइलों को बनाते, नाम बदलने और हटाने) ?
स्कॉट

जवाबों:


299

आप त्रुटियों को दबाने के लिए -sया --no-messagesध्वज का उपयोग कर सकते हैं।

-s, --no- संदेश त्रुटि संदेशों को दबाते हैं

grep pattern * -s -R -n

14
@ एलेक्स @ डॉगबर्ट यह सवाल का जवाब देता है, लेकिन '-s' मास्क की समस्याओं का उदाहरण दे सकता है, उदाहरण के लिए जब आप एक्सपीजीएस का उपयोग करते हैं। एक dir में 2 फाइलें बनाने की कोशिश करें, 'aaa.txt' और 'a b.txt', दोनों में स्ट्रिंग 'कुछ पाठ' है। कमांड /bin/ls -1 | xargs grep 'some text'आपको "ऐसी कोई फ़ाइल या निर्देशिका" नहीं देगा, क्योंकि यह 2 args में 'a b.txt' को तोड़ती है। यदि आप दबाते हैं, तो आप नोटिस नहीं करेंगे कि आप एक फ़ाइल चूक गए हैं।
केल्विन

@Kelvin करता है, उदाहरण के लिए अगर मैं का उपयोग findऔर उपयोग print0के साथ xargs -0कि इस मुद्दे को हल करता है? धन्यवाद
लूका

1
@ लुका इस मुद्दे को हल करना चाहिए। यदि आप हमेशा उन NUL विकल्पों का उपयोग करते हैं, तो आप समस्याओं में नहीं भागेंगे, लेकिन यदि आप नहीं करते हैं, तो यह लगभग गारंटी (IMHO) है जिसे आप सबसे अधिक समय पर भूल जाएंगे।
केल्विन

यह मैक ओएस एक्स पर काम करता है, जहां अन्य विकल्प (--क्वेट) नहीं करते हैं
Philshem

59

यदि आप git रिपॉजिटरी के माध्यम से grepping कर रहे हैं, तो मैं आपको उपयोग करने की सलाह दूंगा git grep। आप -Rया पथ में पारित करने की जरूरत नहीं है ।

git grep pattern

जो आपके वर्तमान निर्देशिका से सभी मैचों को नीचे दिखाएंगे।


5
उपयोगी गिट-विशिष्ट कमांड के लिए +1। हालांकि svn के लिए काम नहीं करेंगे :-)
कैडरियन

2
+1 यह कमांड जो मुझे याद आ रही है - यह मुझे किसी भी कमिट में पेड़ की स्थिति से एक स्ट्रिंग के लिए grep देता है ("पैटर्न" के बाद कमिट जोड़कर)।
केल्विन

1
भगोड़े प्लगइन के साथ, Ggrepवर्तमान निर्देशिका के बजाय गिट निर्देशिका के शीर्ष से शुरू होने वाली खोजों को भी खोजता है।
सिरो सेंटिल्ली 郝海东 i iro i 法轮功 '

यह मानक grep की तुलना में काफी तेज प्रतीत होता है। (शायद यह बाइनरी फ़ाइलों को अनदेखा करता है, आदि। कोई विचार नहीं, लेकिन उपयोगी।)
डैनियल

10

इस तरह की त्रुटियां आमतौर पर "मानक त्रुटि" स्ट्रीम पर भेजी जाती हैं, जिसे आप किसी फ़ाइल पर पाइप कर सकते हैं या अधिकांश कमांड पर गायब कर सकते हैं:

grep pattern * -R -n 2>/dev/null

प्रश्न का उत्तर देता है, लेकिन समस्याओं का सामना कर सकता है। डॉगबर्ट के उत्तर के तहत मेरी टिप्पणी देखें।
केल्विन

5

मैंने देखा है कि कई बार हो रहा है, टूटी हुई लिंक के साथ (सिमिलिंक जो उस फाइल की ओर इशारा करता है जो मौजूद नहीं है), grep लक्ष्य फ़ाइल पर खोज करने की कोशिश करता है, जो मौजूद नहीं है (इसलिए सही और सटीक त्रुटि संदेश)।

मैं आमतौर पर कंसोल पर sysadmin कार्यों को करते समय परेशान नहीं करता हूं, लेकिन स्क्रिप्ट के भीतर मैं "फाइंड" के साथ टेक्स्ट फाइलों की तलाश करता हूं, और फिर प्रत्येक को grep करता हूं:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

के बजाय:

grep -nRHi -e "widehat" /etc

4

मैं आमतौर पर खुद को पुनरावृत्ति नहीं होने देता। आमतौर पर कुछ निर्देशिकाएं होती हैं जिन्हें आप छोड़ना चाहते हैं (.it, .svn ...)

आप इस तरह के एक के साथ चतुर उपनाम कर सकते हैं:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

यह पहली नज़र में भारी लग सकता है, लेकिन जब आपको कुछ पैटर्नों को फ़िल्टर करने की आवश्यकता होती है तो यह काफी आसान होता है।


1
+1। यह त्रुटियों को दबाने से कहीं बेहतर है। हालाँकि, मुझे लगता है कि आप -execअपने grep से पहले भूल गए ।
केल्विन

1
इसका क्या मतलब है? \( -name .svn -o -name .git \)
शाभला

Grep के --exclude या --exlcude-dir झंडे का उपयोग क्यों नहीं किया जाता है?
चॉयलटन बी। हिगिनबॉटम

1
@ शब्‍द कोष्ठक खोज आदेश के लिए परिचालनों का क्रम बनाते हैं। stackoverflow.com/questions/24338777/…
चॉयलटन बी। हिगिनबॉटम

4

क्या आपने xargs-0 में विकल्प आज़माया है ? कुछ इस तरह:

ls -r1 | xargs -0 grep 'some text'

2
खोजने के लिए आप -print0 जोड़ना चाहिएfind -print0 | xargs -0 grep 'text'
aliva

1

-IGrep में उपयोग करें ।

उदाहरण: grep SEARCH_ME -Irs ~/logs


1
-Iबाइनरी फ़ाइलें स्किप करता है - यह इसके बराबर है --binary-files=without-match। हालांकि यह "ऐसी कोई फ़ाइल या निर्देशिका" संदेशों को दबाता नहीं है।
mwfearnley

0

मैं पुन: निर्देशित stderrकरने के लिए stdoutऔर फिर उपयोग ग्रेप के उलट मैचों ( -v) चेतावनी / त्रुटि स्ट्रिंग बाहर करने के लिए है कि मैं छुपाना चाहते हैं:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.