grep, लेकिन केवल कुछ फ़ाइल एक्सटेंशन


964

मैं grepकुछ निर्देशिकाओं के लिए कुछ स्क्रिप्ट लिखने पर काम कर रहा हूं , लेकिन इन निर्देशिकाओं में सभी प्रकार की फ़ाइल प्रकार हैं।

मैं grepअभी .hऔर .cppअभी के लिए चाहता हूं , लेकिन भविष्य में शायद कुछ और।

अब तक मेरे पास:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP email@domain.com

क्या कोई मुझे दिखा सकता है कि मैं अब केवल विशिष्ट फ़ाइल एक्सटेंशन कैसे जोड़ूंगा?


13
कोशिश की grep -r -i CP_Image ~/path1/*.{h,cpp}?

8
का प्रयोग करें रजत खोजकर्ता : ag -i CP_Image ~/path[1-5] | mailx -s GREP email@domain.com। काम हो गया।
जॉन्सवेब


Egrep का उपयोग करें (आपके सिस्टम पर सबसे अधिक संभावना पूर्व-स्थापित है), और फिर आप एक regex का उपयोग कर सकते हैं।
डॉगवॉटर

8
GNU के लोगों ने वास्तव में गड़बड़ कर दी जब उन्होंने इसे फाइलों के लिए खोज -rकरने के grepलिए जोड़ा क्योंकि यह उपकरण होने के UNIX मंत्र को तोड़ता है कि "एक काम करो और इसे अच्छी तरह से करो"। एक बहुत स्पष्ट नाम के साथ फ़ाइलों को खोजने के लिए एक पूरी तरह से अच्छा उपकरण है।
एड मॉर्टन

जवाबों:


1350

बस --includeइस तरह पैरामीटर का उपयोग करें:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

वह करना चाहिए जो आप चाहते हैं।

नीचे दिए गए होल्डऑफहंगर के जवाब से स्पष्टीकरण लेने के लिए :

  • grep: कमान

  • -r: पुनरावर्ती

  • -i: मामले की अनदेखी करें

  • --include \*.cpp: सभी * .cpp: C ++ फाइलें (भागने के मामले में सिर्फ आपके पास फ़ाइलनामों में तारांकन के साथ एक निर्देशिका है)

  • ./: वर्तमान निर्देशिका में प्रारंभ करें।


123
रिकॉर्ड के लिए: -r (पुनरावर्ती) -i (अनदेखा-मामला) --include (केवल फ़ाइल जो फ़ाइल पैटर्न से मेल खाती है खोजें)
लुइस

34
आगे को अनुकूलित किया जा सकता हैgrep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345]
zwol

1
@ यह कहाँ है कि दस्तावेज़ीकरण -R प्रतीकात्मक लिंक के लिए है?
टाइटस

8
इस उदाहरण से ऐसा लगता है कि यह एक उच्च स्कोर है, क्योंकि इसमें कब्जे की एक विस्तृत श्रृंखला शामिल है, लेकिन grep -r --include = *। Txt 'खोजकर्ता' के नीचे दिए गए उत्तर। वास्तव में उत्तर का सार बताता है
डेविड

10
बैकस्लैश के बजाय दोहरे उद्धरण चिह्नों का उपयोग क्यों नहीं करते? जैसे:grep -r -i --include="*.h" --include="*.cpp" CP_Image
pambda

283

इनमें से कुछ जवाब बहुत अधिक वाक्य-भारी लग रहे थे, या उन्होंने मेरे डेबियन सर्वर पर मुद्दों का उत्पादन किया। इसने मेरे लिए पूरी तरह से काम किया:

PHP क्रांति: लिनक्स में फ़ाइलों को कैसे प्राप्त करें, लेकिन केवल कुछ फ़ाइल एक्सटेंशन?

अर्थात्:

grep -r --include=\*.txt 'searchterm' ./

... या केस-असंवेदनशील संस्करण ...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep: कमान

  • -r: पुनरावर्ती

  • -i: मामले की अनदेखी करें

  • --include: सभी * .txt: पाठ फ़ाइलें (यदि आपके पास फ़ाइल नाम में तारांकन चिह्न के साथ निर्देशिका है तो बच जाएं)

  • 'searchterm': क्या खोजे

  • ./: वर्तमान निर्देशिका में प्रारंभ करें।


7
आप बच चाहिए *का उपयोग कर \*.cppया '*.cpp'। अन्यथा यह अपेक्षित परिणाम नहीं देगा जब वर्किंग डायरेक्टरी में कुछ *.txtफाइलें होती हैं।
मेलेबियस

@Melebius आपको बता सकता है कि इसे भागने की आवश्यकता क्यों है - क्या इसका आपके द्वारा बताए गए CPP या TXT एक्सटेंशन से कोई लेना-देना नहीं है? या आपने सिर्फ उन उदाहरणों के रूप में उपयोग किया था?
साइमन ईस्ट

2
@ साइमनएस्ट ये एक्सटेंशन इस प्रश्न और उत्तर में उपयोग किए गए हैं, अन्यथा कुछ खास नहीं। यह संभवत: उपयोग करते समय भागने के बिना काम करेगा --include=<pattern>लेकिन इसके *साथ भागने के लिए महत्वपूर्ण है --include <pattern>(इसके बजाय एक स्थान =) जो अन्यथा बहुत समान लगता है।
मेलेबियस

52
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./

3
grep -rn "grep के लिए कुछ बात" --include = *। {मॉड्यूल, inc, c, h} *
ashish

3
अच्छा उत्तर। IMO पर स्वीकृत की तुलना में क्लीनर लेकिन आपको खोज मापदंड जोड़ना चाहिए जैसा कि @ashish नोट किया गया है
billynoah

--includeसुई के बाद विकल्प क्यों है , अन्य विकल्पों के साथ नहीं?
vladkras

@vladkras, आप सुई का क्या मतलब है? क्या यह है --?
हेरोइनफिनिटी

50

कैसा रहेगा:

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print

5
मैं उन -nameतर्कों को समूहीकृत करने का सुझाव दूंगा । यदि आप नहीं करते हैं तो अजीब चीजें हो सकती हैं। find . \( -name '*.h' -o -name '*.cpp' \) -exec grep "CP_Image" {} \; -print
nullrevolution

सभी निर्देशिका ऑब्जेक्ट्स को अनदेखा करने के लिए अतिरिक्त "-type f" का उपयोग करें, केवल फाइलों में रुचि रखते हैं।
केंसई

1
मैंने वर्षों से इस पद्धति का उपयोग किया है और यह काम करता है, लेकिन यह एक बहुत धीमी गति से पुनरावर्ती grep है क्योंकि खोज के निष्पादन के लिए प्रत्येक फ़ाइल की खोज के लिए एक अलग grep प्रक्रिया होती है।
19

@ बीम्यूड की टिप्पणी को संबोधित करते हुए, findवैकल्पिक रूप से तर्कों को बंडल कर सकते हैं, जो कम से कम प्रक्रिया को आमंत्रित कर सकते हैं। find . \( -name \*.h -o -name \*.cpp \) -exec grep -H CP_Image {} + यह सुझाव दिया गया है लेकिन नीचे दिए गए @ फेडोरक्वि के उत्तर में हाइलाइट नहीं किया गया है और यह एक सार्थक सुधार है। -Hयहाँ grep का तर्क तब उपयोगी होता है जब केवल एकल मिलान वाली फ़ाइल की पहचान करता है। यह -printउत्तर में उपयोग को समाप्त कर सकता है । यदि आपकी फ़ाइलों की कुल सूची पर्याप्त रूप से छोटी है, तो पुनरावर्ती शेल ग्लोब (जैसे। {path1,path2}/**/*.{cpp,h}) का उपयोग करना बेहतर हो सकता है।
मैल्कम

19

एचपी और सन सर्वर पर कोई आरआर विकल्प नहीं है, इस तरह से मेरे एचपी सर्वर पर मेरे लिए काम किया

find . -name "*.c" | xargs grep -i "my great text"

मैं स्ट्रिंग के असंवेदनशील मामले के लिए है


1
मैं वेब होस्टिंग कंपनियों के लिए कई सर्वरों पर आया हूं जिनके पास --include विकल्प नहीं है fgrep के लिए उपलब्ध है और यह कमांड लाइन है जो मैं उन उदाहरणों में उपयोग करता हूं।
बोर्गबॉय

Git for Windows (MinGW / MSys) का उपयोग करते समय --include विकल्प भी उपलब्ध नहीं है।
डेरेन लुईस

@DarrenLewis विंडोज के लिए Git Bash में उपलब्ध है। लेकिन अजीब, ऐसा रंगीन उपनाम कहते हैं llलेकिन नहीं जोड़ता है --color=autogrep करने के लिए।

यह पूर्णता, पोर्टेबिलिटी और संक्षिप्तता के लिए स्वीकृत उत्तर होना चाहिए!
ग्रांट फोस्टर

12

चूंकि यह फ़ाइलों को खोजने का मामला है , चलो उपयोग करें find!

जीएनयू का उपयोग करके आप -regexउन फ़ाइलों को निर्देशिकाओं के पेड़ में खोजने के लिए विकल्प का उपयोग कर सकते हैं, जिनका विस्तार .hया तो है .cpp:

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

फिर, यह grepअपने प्रत्येक परिणाम पर अमल करने की बात है :

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

यदि आपके पास यह पता लगाने का वितरण नहीं है कि आपको आमिर अफगानी की तरह दृष्टिकोण का उपयोग -oकरना है, तो संक्षिप्त विकल्प का उपयोग करके ( नाम या तो साथ .hया साथ समाप्त हो रहा है.cpp ):

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

और अगर आप वास्तव में उपयोग करना चाहते हैं grep, तो संकेत दिए गए सिंटैक्स का पालन करें --include:

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^

7

सबसे आसान तरीका है

find . -type  f -name '*.extension' | xargs grep -i string 

3

ag (रजत खोजकर्ता) के पास इसके लिए बहुत सरल वाक्यविन्यास है

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

इसलिए

ag -G *.h -G *.cpp CP_Image <path>

2.2.0 ag _string_to_find_ -G _filename_regex_
अगस्त

3

नीचे उत्तर अच्छा है:

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP email@domain.com

लेकिन इसके लिए अद्यतन किया जा सकता है:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP email@domain.com

जो अधिक सरल हो सकता है।


1

प्रत्येक "-o -name" के लिए "-exec grep" लिखना चाहिए

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

या उनके द्वारा समूह ()

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

विकल्प '-Hn' फ़ाइल का नाम और लाइन दिखाता है।


1

मुझे पता है कि यह प्रश्न थोड़ा दिनांकित है, लेकिन मैं .c और .h फ़ाइलों को खोजने के लिए आमतौर पर उपयोग की जाने वाली विधि को साझा करना चाहूंगा :

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

या यदि आपको लाइन नंबर की आवश्यकता है:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.