Como eu posso “grep” filtrar recursivamente o nome dos arquivos que eu quero com curingas?

33

Quando eu quero realizar uma busca grep recursiva no diretório atual, geralmente faço:

grep -ir "string" .

Mas esse comando pesquisa dentro de todos os tipos de arquivos, incluindo arquivos binários (imagens, áudio, vídeo, etc ...), o que resulta em um processo de pesquisa muito lento.

Se eu fizer isso, por exemplo, não funciona:

grep -ir "string" *.php

Ele não funciona porque não há arquivos PHP dentro do diretório atual, mas dentro de alguns dos subdiretórios no diretório atual, e os nomes dos subdiretórios não terminam com ".php", então o grep não parece dentro deles.

Então, como posso fazer uma pesquisa recursiva a partir do diretório atual, mas também especificando curingas de nome de arquivo? (ou seja, pesquisar apenas em arquivos que terminam em uma extensão específica)

    
por OMA 23.05.2014 / 10:42

3 respostas

46

Use grep da opção --include :

grep -ir "string" --include="*.php" .
    
por 23.05.2014 / 10:49
14

Se você tiver uma versão de grep sem a opção --include , use o seguinte. Ambos foram testados em uma estrutura de diretórios como esta:

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

Onde todos os arquivos .php contêm a string string .

  1. Use find

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

    Explicação

    Isso localizará todos os arquivos .php e, em seguida, executará grep -H string em cada um deles. Com a opção find do -exec , {} é substituído por cada um dos arquivos encontrados. O -H informa grep para imprimir o nome do arquivo, bem como a linha correspondente.

  2. Supondo que você tenha uma versão nova o suficiente de bash , use globstar :

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

    Explicação

    Como explicado no manual do bash :

    globstar

    If set, the pattern ‘**’ used in a filename expansion context will match all files and zero or more directories and subdirectories. If the pattern is followed by a ‘/’, only directories and subdirectories match.

    Portanto, executando shopt -s globstar , você está ativando o recurso e A opção globstar do Bash que torna **/*php expandida para todos os arquivos .php no diretório atual ( ** corresponde a 0 ou mais diretórios, portanto **/*php corresponde também a ./foo.php ), que são agrupados por string .

por 23.05.2014 / 20:12
-2

Use */*.php

Isto faz com que o grep pesquise um nível de subdiretório

    
por 05.04.2016 / 11:12