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.
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
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'}
essayez de supprimer les doubles guillemets
grep --include=*.{html,php,htm} pattern -R /some/path
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}
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
.
il fonctionne dans le même but, mais sans option --include
. Il fonctionne sur grep 2.5.1.
grep -v -E ".*\.(html|htm|php)"