65 votes

Comment puis-je faire un "grep" récursif filtrant le nom des fichiers que je veux avec des jokers ?

Lorsque je veux effectuer une recherche récursive grep dans le répertoire courant, je le fais habituellement :

grep -ir "string" .

Mais cette commande recherche dans tous les types de fichiers, y compris les fichiers binaires (images, audio, vidéo, etc...), ce qui entraîne un processus de recherche très lent.

Si je fais ça, par exemple, ça ne marche pas :

grep -ir "string" *.php

Cela ne fonctionne pas parce qu'il n'y a pas de fichiers PHP dans le répertoire courant, mais dans certains sous-répertoires du répertoire courant, et les noms des sous-répertoires ne se terminent pas par ".php", donc grep ne cherche pas dans ces derniers.

Alors, comment puis-je faire une recherche récursive à partir du répertoire actuel tout en spécifiant des caractères génériques pour les noms de fichiers ? (c.-à-d. rechercher uniquement dans les fichiers qui se terminent par une extension spécifique)

94voto

Dan D. Points 5666

Utilisez grep 's --include option :

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

17voto

Mohsin Points 11

Si vous avez une version de grep qui n'a pas le --include vous pouvez utiliser l'option suivante. Ces deux options ont été testées sur une structure de répertoire comme celle-ci :

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

Où tous les .php contiennent la chaîne de caractères string .

  1. Utilisez find

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

    Explication

    Cela permettra de trouver tous les .php et ensuite exécuter grep -H string sur chacun d'eux. Avec find 's -exec option, {} est remplacé par chacun des fichiers trouvés. Le site -H dit à grep pour imprimer le nom du fichier ainsi que la ligne correspondante.

  2. En supposant que vous avez une version suffisamment récente de bash utiliser globstar :

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

    Explication

    Comme expliqué dans le manuel bash :

    Étoile du globe

    S'il est défini, le motif '**' utilisé dans un contexte d'expansion de nom de fichier correspondra à tous les fichiers et à zéro ou plusieurs répertoires et sous-répertoires. Si le motif est suivi d'un '/', seuls les répertoires et sous-répertoires seront pris en compte.

    Ainsi, en exécutant shopt -s globstar vous activez la fonction et de Bash globstar qui fait de **/*php s'étendre à tous .php dans le répertoire actuel ( ** correspond à 0 ou plusieurs répertoires, donc **/*php correspond à ./foo.php également) qui sont ensuite recherchées dans les string .

-2voto

Dennis Nolan Points 11

Utilisez */*.php

Cela permet à grep de rechercher un niveau de sous-répertoire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X