comment puis-je utiliser la commande grep --option inclure plusieurs types de fichiers?
Quand je veux grep tous les fichiers html dans un répertoire, je ne les suivants
grep --include="*.html" pattern -R /some/path
qui fonctionne bien. Le problème est de savoir comment grep tout le html,htm,php les fichiers dans un répertoire?
De cette Utiliser grep --exclude/--la syntaxe de ne pas grep par le biais de certains fichiers, il semble que je peux faire la suite
grep --include="*.{html,php,htm}" pattern -R /some/path
Mais malheureusement, cela ne fonctionne pas pour moi.
Pour info, mon grep version 2.5.1.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser plusieurs
--include
drapeaux. Cela fonctionne pour moi:grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/
Cependant, vous pouvez faire en tant que
Deruijter
suggéré. Cela fonctionne pour moi:grep -r --include=*.{html,php,htm} "pattern" /some/path/
N'oubliez pas que vous pouvez utiliser
find
etxargs
pour ce genre de chose:find /some/path/-name "*.htm*" -or -name "*.php" | xargs grep "pattern"
HTH
xargs
. Ceci est aussi mérite une lecture rapide. HTH.*
est encore soumis à d'expansion dans le cadre de la marque il est inclus dans, c'est juste passe ne correspondent à rien dans ce cas, puisque seuls les fichiers littéralement nommé quelque chose comme--include=foo.html
correspondent. Pour être sûr, de citer le*
(qui peut vous faire individuellement avec\*
). Comme un bonus supplémentaire de ce fait, il visuellement plus claire qui est ce n'est pas le shell que doit effectuer l'expansion dans ce cas.find
solution: à l'aide-exec grep "pattern" {} +
au lieu de| xargs grep "pattern"
est plus robuste (gère les noms de fichiers avec des espaces, par exemple) ainsi que plus efficace.-exec
lieu dexargs
-find -exec
axargs
logique construit en (c'est peut-être ce que tu voulais dire). Comme pour les tubes: tant que les arguments de flux via stdin, plutôt que d'être passé sur la ligne de commande (avec ou sans "pipeline"), il ne devrait pas être un problème (en raison dexargs
intelligent de derrière-le-scènes argument de segmentation).À l'aide de
{html,php,htm}
ne peut fonctionner que comme un attelle d'extension, ce qui est un non standard (non POSIX) de la fonction debash
,ksh
, etzsh
.En d'autres termes: n'essayez pas de l'utiliser dans un script qui cible
/bin/sh
- utilisation explicite plusieurs--include
arguments dans ce cas.grep
lui-même ne pas comprendre{...}
notation.Pour une orthèse d'extension pour être reconnu, il doit être un non cotées (partie d'une) jeton sur la ligne de commande.
Une attelle d'extension étend à plusieurs arguments, donc, dans le cas à portée de main
grep
finit par voir plusieurs--include=...
options, comme si vous aviez passé individuellement.Les résultats d'une orthèse d'extension sont sous réserve d'expansion (extension de nom de fichier), qui a pièges:
Chaque argument pourrait être élargi à l'appariement des noms de fichiers s'il contient des non cotées d'expansion des caractères tels que
*
.Bien que cela soit peu probable qu'avec des marques telles que
--include=*.html
(par exemple, vous devez avoir un fichier littéralement nommé quelque chose comme--include=foo.html
pour quelque chose de match), il est utile de garder à l'esprit en général.Si le
nullglob
option shell se trouve être activée (shopt -s nullglob
) et d'expansion correspond à rien, l'argument sera jeté.Donc, pour entièrement une solution robuste, utilisez la commande suivante:
'--include=*.'
est traité comme un littérale, en raison d'être unique cité; ce qui empêche toute interprétation de*
comme une expansion de caractère.{html,php,htm}
, la nécessité - non cotées attelle d'extension[1]s'élargit pour 3 arguments, qui, en raison de
{...}
directement à la suite de la'...'
jeton, inclure ce jeton.Par conséquent, après la citation de suppression par le shell, suivantes 3 littérale arguments sont finalement passés à
grep
:--include=*.html
--include=*.php
--include=*.htm
[1] Plus précisément, il est seulement la syntaxe pertinentes parties de l'attelle d'extension qui doit être non cotées, la liste des éléments peut encore être individuellement cité et doit l'être si elles contiennent de l'expansion des caractères de remplacement qui pourrait entraîner indésirables d'expansion après l'accolade de l'expansion, tandis que pas nécessaire dans ce cas, le ci-dessus peut être écrite comme
'--include=*.'{'html','php','htm'}
bash
sur n'importe quelle plateforme quebash
s'exécute sur.Essayez de supprimer les guillemets
grep --include=\*.{html,php,htm} pattern -R /some/path
. Il a travaillé pour moi.ce n'est pas du travail?
De l'essayer.
-r va faire une recherche récursive.
-de la volonté de supprimer les fichier non trouvé des erreurs.
-n va vous montrer le numéro de ligne du fichier dans lequel le modèle est trouvé.
Utilisation
grep
avecfind
commandeVous pouvez utiliser
-regex
et-regextype
options de trop.Il travaille pour le même but, mais sans
--include
option. Il fonctionne sur grep 2.5.1 ainsi.