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

quand je veux récupérer tous les fichiers html dans un répertoire, je fais ce qui suit

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

qui fonctionne bien. Le problème est de récupérer tous les fichiers html,htm, php dans un répertoire quelconque?

à partir de ce utiliser grep -- exclude/ -- include syntax to not grep through certain files , il semble que je peux faire la suivante

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

But malheureusement, cela ne fonctionne pas pour moi.

POUR INFO, ma version grep est 2.5.1.

68
demandé sur Community 2012-05-16 17:03:02

7 réponses

vous pouvez utiliser plusieurs drapeaux --include . Cela fonctionne pour moi:

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

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

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

N'oubliez pas que vous pouvez utiliser find et xargs pour ce genre de chose:

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

HTH

97
répondu Steve 2012-05-16 23:52:45

utilisant {html,php,htm} ne peut fonctionner que comme un extension de la bretelle , qui est une caractéristique non standard (non conforme à POSIX) de bash , ksh , et zsh .

  • en d'autres termes: ne pas essayer de l'utiliser dans un script qui cible /bin/sh - utiliser explicite arguments multiples --include dans ce cas.

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

pour qu'un agrandissement de la bretelle soit reconnu, le doit être un sans cote (partie d'un jeton sur la ligne de commande.

Une attelle d'extension se développe plusieurs arguments , donc, dans le cas à portée de la main grep finit par voir multiple --include=... options, comme si vous les aviez passées individuellement.

les résultats d'une extension de corset sont sujet à globbing (extension de nom de fichier) , qui a pièges :

  • " non cotée metacharactères globbing tels que * .

    Bien que cela soit peu probable avec des jetons tels que --include=*.html (par exemple, vous devez avoir un fichier littéralement nommé quelque chose comme --include=foo.html pour quelque chose à correspondre), il est intéressant de garder à l'esprit en général.

  • si l'option nullglob shell est activée ( shopt -s nullglob ) et que globbing correspond rien , l'argument sera rejeté .

par conséquent, pour une solution entièrement robuste , utilisez ce qui suit:

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.' est traité comme un littéral , en raison d'être single-quoted ; cela empêche l'interprétation par inadvertance de * comme un globbing caractère.

  • {html,php,htm} , la nécessité - non cotées accolade de l'expansion [1] , augmente à 3 arguments, qui, en raison de {...} directement à la suite du '...' token , inclure que token.

  • donc, après enlèvement de citation par le shell, 3 littérale arguments sont finalement passés à grep :

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

[1] plus précisément, ce n'est que la syntaxe 1519360920" les parties de l'extension de la bretelle qui doivent être non cotées, les éléments de la liste peuvent encore être citées individuellement et doivent l'être si elles contiennent des métacharges de globbing qui pourraient entraîner un globbing non désiré après l'extension de la bretelle; bien que ce ne soit pas nécessaire dans ce cas, ce qui précède pourrait être écrit comme suit:

'--include=*.'{'html','php','htm'}

13
répondu mklement0 2017-06-04 03:21:55

essayez de supprimer les doubles guillemets

grep --include=*.{html,php,htm} pattern -R /some/path
9
répondu Deruijter 2012-05-16 13:10:07

ça ne marche pas?

  grep pattern  /some/path/*.{html,php,htm} 
4
répondu Vijay 2012-05-16 13:08:03

essayez ceci. -r va faire une recherche récursive. -s supprimera les erreurs non trouvées. -n vous indiquera le numéro de ligne du fichier où le motif est trouvé.

    grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}
2
répondu Pradeep 2015-10-20 07:09:53

Utiliser grep avec find commande

find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f 
 -exec grep PATTERN {} \+

vous pouvez aussi utiliser les options -regex et -regextype .

0
répondu Prince John Wesley 2012-05-16 16:22:23

il fonctionne dans le même but, mais sans option --include . Il fonctionne sur grep 2.5.1.

grep -v -E ".*\.(html|htm|php)"
0
répondu Kohei Mikami 2018-08-16 14:10:17