वाइल्डकार्ड्स के साथ मैं उन फ़ाइलों के नाम को कैसे "grep" पुन: फ़िल्टर कर सकता हूं?


40

जब मैं वर्तमान निर्देशिका में एक पुनरावर्ती grep खोज करना चाहता हूं, तो मैं आमतौर पर करता हूं:

grep -ir "string" .

लेकिन वह कमांड सभी प्रकार की फाइलों के अंदर खोज करता है, जिसमें बाइनरी फाइलें (चित्र, ऑडियो, वीडियो, आदि ...) शामिल हैं, जिसके परिणामस्वरूप बहुत धीमी खोज प्रक्रिया होती है।

अगर मैं ऐसा करता हूं, उदाहरण के लिए, यह काम नहीं करता है:

grep -ir "string" *.php

यह काम नहीं करता है क्योंकि वर्तमान निर्देशिका के अंदर कोई PHP फाइलें नहीं हैं, लेकिन वर्तमान निर्देशिका में कुछ उपनिर्देशिकाओं के अंदर हैं, और उपनिर्देशिका के नाम ".php" के साथ समाप्त नहीं होते हैं इसलिए grep उनके अंदर नहीं दिखता है।

इसलिए, मैं वर्तमान निर्देशिका से एक पुनरावर्ती खोज कैसे कर सकता हूं, लेकिन फ़ाइल नाम वाइल्डकार्ड निर्दिष्ट भी कर सकता हूं? (अर्थात: केवल उन फाइलों में खोजें जो किसी विशिष्ट एक्सटेंशन में समाप्त होती हैं)

जवाबों:


58

उपयोग grepके --includeविकल्प:

grep -ir "string" --include="*.php" .

1
ठीक है, ऐसा लगता है कि मेरे grep का संस्करण पुराना था, क्योंकि इसमें वह विकल्प नहीं था (आश्चर्य नहीं कि मैं ऐसा करने के लिए समझ क्यों नहीं सका!)। मुझे यह संदेश मिला: "grep: अपरिचित विकल्प" - -संकल = *। Php '"। लेकिन मैंने अभी एक नए को अपग्रेड किया है और अब यह काम करता है। धन्यवाद!
ओएमए

मुझे अंत में अवधि को बदलना और उपयोग करना था:grep -ir "string" --include="*.php" *
स्टुअर्ट

मुझे लगा कि अवधि सिर्फ रेखा के अंत थी! मैंने उपयोग या आवश्यकता नहीं की।
बोर्ड

14

यदि आपके पास विकल्प grepका अभाव है --include, तो आप निम्न का उपयोग कर सकते हैं। ये दोनों इस तरह एक निर्देशिका संरचना पर परीक्षण किया गया:

$ tree
.
├── a
├── b
   └── foo2.php
├── c
   └── d
       └── e
           └── f
               └── g
                   └── h
                       └── foo.php
├── foo1.php
└── foo.php

जहां सभी .phpफाइलों में स्ट्रिंग होती है string

  1. उपयोग find

    $ find . -name '*php' -exec grep -H string {} +
    ./b/foo2.php:string
    ./foo1.php:string
    ./c/d/e/f/g/h/foo.php:string
    

    व्याख्या

    यह सभी .phpफाइलें ढूंढेगा और फिर grep -H stringउनमें से प्रत्येक पर रन करेगा। साथ findके -execविकल्प, {}फ़ाइलें मिल में से प्रत्येक के द्वारा बदल दिया गया है। -Hबताता है grepफ़ाइल नाम के साथ-साथ मिलान किया लाइन मुद्रित करने के लिए।

  2. मान लें कि आप का एक नया संस्करण है पर्याप्त bash, उपयोग globstar:

    $ shopt -s globstar
    $ grep -H string  **/*php
    b/foo2.php:string
    c/d/e/f/g/h/foo.php:string
    foo1.php:string

    व्याख्या

    बाश मैनुअल में बताया गया है :

    globstar

    यदि सेट किया जाता है, तो फ़ाइल नाम विस्तार के संदर्भ में उपयोग किया जाने वाला पैटर्न '**' सभी फाइलों और शून्य या अधिक निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएगा। यदि पैटर्न '/' द्वारा अनुसरण किया जाता है, तो केवल निर्देशिकाएं और उपनिर्देशिकाएं मेल खाती हैं।

    तो, shopt -s globstarआपको चलाकर , फीचर और बैश के globstarविकल्प को सक्रिय कर रहे हैं , जो वर्तमान निर्देशिका में **/*phpसभी .phpफ़ाइलों का विस्तार करता है ( **0 या अधिक निर्देशिकाओं से **/*phpमेल खाता है , इसलिए मेल खाता है ./foo.php) जो तब के लिए grepped हैं string


-2

उपयोग */*.php

यह grep खोज को उपनिर्देशिका का एक स्तर बनाता है


तारांकन और डॉट्स गायब होते ही कुछ गड़बड़ हो गई।
डेनिस नोलन

आप मार्कड प्रारूपण में जोर देने के लिए तारांकन प्रारूप के उपयोग के लिए बैकस्टिक्स का उपयोग कर सकते हैं और तारांकन के उपयोग के बारे में अस्पष्टता से बच सकते हैं। पीएस ध्यान दें कि प्रश्न अंतिम पैराग्राफ में "पुनरावर्ती खोज" के बारे में पूछता है (मेरे डाउनवोट हालांकि नहीं)।
RedGrittyBrick

सही उत्तर नहीं, क्योंकि यह केवल एक स्तर की गहरी निर्देशिका संरचनाओं के लिए अच्छा है, जैसा कि आप उल्लेख करते हैं, लेकिन फिर भी यह जानना अच्छा है।) उसके लिए मेरा उत्थान।
ओएमए
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.