34

Когда я хочу выполнить рекурсивный поиск grep в текущем каталоге, я обычно делаю:

grep -ir "string" .

Но эта команда выполняет поиск во всех видах файлов, включая двоичные файлы (изображения, аудио, видео и т.д.), Что приводит к очень медленному процессу поиска.

Если я сделаю это, например, это не сработает:

grep -ir "string" *.php

Это не работает, потому что в текущем каталоге нет файлов PHP, но внутри некоторых подкаталогов в текущем каталоге, а имена подкаталогов не заканчиваются на «.php», поэтому grep не заглядывает внутрь них.

Итак, как я могу сделать рекурсивный поиск из текущего каталога, но также указав подстановочные знаки имени файла? (т.е.: поиск только в файлах, которые заканчиваются определенным расширением)

3 ответа3

48

Используйте опцию grep --include :

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 's -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
    

    объяснение

    Как объяснено в руководстве по bash :

    globstar

    Если установлено, шаблон «**», используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогов и подкаталогов. Если за шаблоном следует знак «/», совпадут только каталоги и подкаталоги.

    Таким образом, запустив shopt -s globstar вы активируете функцию и опцию Bash globstar которая позволяет **/*php расширяться до всех файлов .php в текущем каталоге (** соответствует 0 или более каталогам, поэтому **/*php соответствует ./foo.php ), которые затем обретают string .

-2

Используйте */*.php

Это делает поиск grep одним уровнем подкаталога

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .