127 votes

Comment utiliser l'option grep --include pour plusieurs types de fichiers ?

Lorsque je souhaite rechercher tous les fichiers html d'un répertoire, je procède de la manière suivante

grep --include="*.html" pattern -R /some/path

qui fonctionne bien. Le problème est de savoir comment greper tous les fichiers html, htm, php dans un certain répertoire ?

A partir de là Utiliser la syntaxe grep --exclude/--include pour ne pas chercher dans certains fichiers. Il semble que je puisse faire ce qui suit

grep --include="*.{html,php,htm}" pattern -R /some/path

Mais malheureusement, cela ne fonctionnerait pas pour moi.
Pour information, ma version de grep est la 2.5.1.

175voto

Steve Points 18420

Vous pouvez utiliser plusieurs --include drapeaux. Voici ce qui fonctionne pour moi :

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

Cependant, vous pouvez faire comme Deruijter a suggéré . Cela fonctionne pour moi :

grep -r --include=*.{html,php,htm} "pattern" /some/path/

N'oubliez pas que vous pouvez utiliser find y xargs pour ce genre de choses également :

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"

45voto

mklement0 Points 12597

tl;dr

# Works in bash, ksh, and zsh.
grep -R '--include=*.'{html,php,htm} pattern /some/path

Utilisation {html,php,htm} ne peut fonctionner qu'en tant que expansion de l'orthèse qui est une fonctionnalité non standard (non conforme à POSIX) de la norme bash , ksh y zsh .

  • En d'autres termes : n'essayez pas de l'utiliser dans un script qui vise à /bin/sh - utiliser explicite multiples --include dans cette affaire.

  • grep lui-même fait pas comprendre {...} notation.

Pour qu'une extension d'accolade soit reconnue, elle doit doit être un non cotée (partie d'un) jeton sur la ligne de commande.

Expansion de l'orthèse s'étend à arguments multiples Ainsi, dans le cas présent grep finit par voir multiples --include=... options comme si vous les aviez passés individuellement.

Les résultats d'une expansion d'accolade sont soumis au globbing (expansion du nom de fichier) qui a pièges :

  • Chaque argument résultant peut être étendu à des noms de fichiers correspondants s'il contient non cotée les métacaractères de globalisation tels que * .
    Bien que cela soit peu probable avec des jetons tels que le --include=*.html (par exemple, vous devez disposer d'un fichier littéralement nommée quelque chose comme --include=foo.html pour trouver quelque chose qui corresponde), il vaut la peine de garder cela à l'esprit en général.

  • Si le nullglob est activée ( shopt -s nullglob ) et les correspondances globales rien l'argument sera mis au rebut .

Par conséquent, pour les une solution entièrement robuste utiliser ce qui suit :

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.' est traité comme un littéral , du fait qu'il s'agit d'une entre guillemets ; cela permet d'éviter une interprétation involontaire des * en tant que caractère de globalisation.

  • {html,php,htm} , le - par nécessité - non cotée expansion de l'orthèse [1] s'étend à 3 des arguments qui, en raison de la {...} directement à la suite de la '...' jeton , inclure ce jeton.

  • Par conséquent, après l'enlèvement des citations par la coquille, les suivants 3 littéral sont finalement transmis à grep :

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1] Plus précisément, il s'agit seulement de la pertinent pour la syntaxe les parties de l'expansion de l'accolade qui doivent être non citées, le éléments de la liste peuvent toujours être cités individuellement et doivent l'être s'ils contiennent des métacaractères de globalisation qui pourraient entraîner une globalisation non désirée après l'expansion de l'accolade ; bien que cela ne soit pas nécessaire dans ce cas, ce qui précède pourrait être écrit sous la forme suivante
'--include=*.'{'html','php','htm'}

11voto

Deruijter Points 672

Essayez de supprimer les guillemets

grep --include=*.{html,php,htm} pattern -R /some/path

5voto

Vijay Points 17992

Cela ne fonctionne-t-il pas ?

  grep pattern  /some/path/*.{html,php,htm}

5voto

Kohei Mikami Points 1804

Il fonctionne dans le même but, mais sans --include option. Cela fonctionne également avec grep 2.5.1.

grep -v -E ".*\.(html|htm|php)"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X