* .C फ़ाइलों के लिए पुनरावर्ती grep विफल रहता है


13

मैंने निम्न तरीके से सभी .c फाइलों में एक पैटर्न को फिर से खोजने की कोशिश की

> grep -lr search-pattern *.c

लेकिन यह आउटपुट के रूप में मिला

> grep: *.c: No such file or directory

जब मैं इसका उपयोग करता हूं:

> grep -lr search-pattern *

मुझे बहुत मिलता है। सी पैटर्न के साथ निर्देशिकाओं में फ़ाइलें।

पहले की अभिव्यक्ति में क्या गलत है?

जवाबों:


22

मैं --includeविकल्प का उपयोग करने का सुझाव देता हूं grep:

grep -lr --include='*.c' search-pattern .

1
+1। मुझे --include=GLOBविकल्प नहीं पता था । पुनरावर्ती विकल्प के संयोजन में यह बहुत शक्तिशाली है और इसकी आवश्यकता नहीं है find। अच्छा!
gertvdijk

यहां पार्टी के लिए देर हो चुकी है, लेकिन मैं इस बारे में उलझन में हूं .कि कमांड के अंत में क्या है।
नाथन जोन्स

1
@NathanJones: grep को एक या एक से अधिक फ़ाइल नाम या निर्देशिका की आवश्यकता होती है, जिसमें खोज की जाती है। डॉट कहता है: वर्तमान निर्देशिका में खोजें
enzotib

3

*.cपैटर्न अपने खोल से मूल्यांकन किया जाता है। यह वर्तमान निर्देशिका पर लागू होता है, जैसे आप उपयोग कर रहे हैं ls *.c

मुझे लगता है कि आप इसके बजाय जो चाहते हैं, वह है कि *.cपैटर्न से मेल खाती सभी फाइलें (पुनरावर्ती) मिलें और उसमें आपकी grepखोज हो। यहाँ एक तरीका है कि:

find . -name "*.c" -print0 | xargs --null grep -l search-pattern

इसका उपयोग xargsखोज परिणामों को जोड़ने के लिए करता है find


वैकल्पिक रूप से, -execखोजने के लिए विकल्प का उपयोग करें , उदाहरण के लिए:

find . -name "*.c" -exec grep -l search-pattern "{}" \;

इसके अलावा, मुझे यकीन नहीं है कि आप वास्तव में -lविकल्प चाहते हैं grep। यह पहले मैच में रुकेगा:

-l, --files-with-matches
      Suppress normal output; instead print the name of  each
      input  file  from which output would normally have been
      printed.  The scanning will stop on  the  first  match.
      (-l is specified by POSIX.)

find/xargsरिक्त स्थान युक्त फ़ाइल नाम पर वाक्य रचना टूट जाता है। प्रत्येक फ़ाइल के पहले मैच पर रोक का -Lविकल्प grepऔर अगली फ़ाइल के साथ जारी रखें: यदि कोई केवल यह देखना चाहता है कि क्या पैटर्न प्रत्येक दिए गए फ़ाइल में कम से कम एक बार समाहित है, तो यह जल्दी है।
enzotib

@enzotib धन्यवाद, इसे -print0विकल्प का उपयोग करके तय किया और xargs --null
गर्टवदिजक

-1

मुझे पता है कि यह एक पुराना धागा है, लेकिन चूंकि मेरे पास एक ही सवाल था, इसलिए मैं अपने पसंदीदा तरीके को साझा करने के लिए, बहुत छोटे रूप में साझा करना चाहता हूं।

ls | grep "file.*.c"

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