Quand je veux grep 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 savoir comment grep tous les fichiers html, htm, php dans un répertoire?
À partir de cela, utilisez grep --exclude / - include syntax pour ne pas grep via 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 info, ma version grep est 2.5.1.
xargs
. Cela vaut également la peine d'être lu rapidement. HTH.*
est toujours sujet au globbing dans le cadre du jeton dans lequel il est intégré , il se trouve que cela ne correspond à rien dans ce cas, car seuls les fichiers littéralement nommés quelque chose comme--include=foo.html
correspondent. Pour être sûr, citez le*
(que pouvez-vous faire individuellement avec\*
). En prime, cela rend visuellement plus clair que ce n'est pas le shell qui devrait effectuer le globbing dans ce cas.find
solution: utiliser-exec grep "pattern" {} +
au lieu de| xargs grep "pattern"
est plus robuste (gère les noms de fichiers avec des espaces, par exemple) et plus efficace.L' utilisation
{html,php,htm}
ne peut fonctionner comme une expansion des accolades , ce qui est une caractéristique de non standard (non-conforme aux spécifications POSIX)bash
,ksh
etzsh
.En d'autres termes: n'essayez pas de l'utiliser dans un script qui cible
/bin/sh
- utilisez plusieurs arguments explicites--include
dans ce cas.grep
lui-même ne comprend pas la{...}
notation.Pour qu'une extension d'accolade soit reconnue, il doit s'agir d'un jeton non guillemet (partie d'un) sur la ligne de commande.
Une extension d'accolade se développe en plusieurs arguments , donc dans le cas présent
grep
finit par voir plusieurs--include=...
options, comme si vous les aviez passées individuellement.Les résultats d'une expansion d'accolades sont sujets au globbing (expansion du nom de fichier) , qui présente des pièges :
Chaque argument résultant peut être étendu aux noms de fichiers correspondants s'il contient des métacaractères globuleux sans guillemets tels que
*
.Bien que cela soit peu probable avec des jetons tels que
--include=*.html
(par exemple, vous devez avoir un fichier nommé littéralement quelque chose comme--include=foo.html
pour que quelque chose corresponde), cela vaut la peine de garder à l'esprit en général.Si l'
nullglob
option shell est activée (shopt -s nullglob
) et que le globbing ne correspond à rien , l'argument sera rejeté .Par conséquent, pour une solution entièrement robuste , utilisez les éléments suivants:
'--include=*.'
est traité comme un littéral , car il est entre guillemets simples ; cela empêche une interprétation par inadvertance de*
comme un caractère globuleux.{html,php,htm}
, l' expansion d'accolades - par nécessité - sans guillemets [1] , se développe en 3 arguments, qui, en raison de{...}
suivre directement le'...'
jeton , incluent ce jeton.Par conséquent, après la suppression des guillemets par le shell, les 3 arguments littéraux suivants sont finalement passés à
grep
:--include=*.html
--include=*.php
--include=*.htm
[1] Plus précisément, ce ne sont que les parties syntaxiques de l'expansion d'accolades qui doivent être sans guillemets, les éléments de la liste peuvent toujours être entre guillemets individuellement et doivent l'être s'ils contiennent des métacaractères globuleux qui pourraient entraîner un globbing indésirable après l'expansion d'accolades; bien que cela ne soit pas nécessaire dans ce cas, ce qui précède pourrait être écrit comme
'--include=*.'{'html','php','htm'}
la source
bash
sur n'importe quelle plate-forme quibash
fonctionne.Essayez de supprimer les guillemets
la source
grep --include=\*.{html,php,htm} pattern -R /some/path
. Cela a fonctionné pour moi.cela ne fonctionne pas?
la source
Essaye ça. -r fera une recherche récursive. -s supprimera les erreurs de fichier non trouvées. -n vous montrera le numéro de ligne du fichier où se trouve le motif.
la source
-I
à l'ensemble standard. Il ignore les fichiers binaires (qui ne sont pratiquement jamais recherchés), ce qui augmente l'efficacité. Ensuite, nous allonsgrep -rIns ...
qui joue bien en acoustique :)Cela fonctionne dans le même but, mais sans
--include
option. Cela fonctionne également sur grep 2.5.1.la source
Utiliser
grep
avec lafind
commandeVous pouvez utiliser
-regex
et les-regextype
options aussi.la source