Cuando quiero grep todos los archivos html en algún directorio, hago lo siguiente
grep --include="*.html" pattern -R /some/path
que funciona bien. El problema es cómo agrupar todos los archivos html, htm, php en algún directorio.
Desde este Use grep --exclude / - incluya sintaxis para no grep a través de ciertos archivos , parece que puedo hacer lo siguiente
grep --include="*.{html,php,htm}" pattern -R /some/path
Pero, lamentablemente, no funcionaría para mí.
FYI, mi versión de grep es 2.5.1.
xargs
. Este es también digno de una lectura rápida. HTH.*
sigue siendo objeto de comodines como parte de la ficha que está incrustado en , sólo sucede que no encuentro nada en este caso, porque sólo los archivos , literalmente, un nombre como--include=foo.html
se correspondería. Para estar seguro, cite el*
(que puede hacer individualmente\*
). Como ventaja adicional, esto hace que sea visualmente más claro que no es el caparazón el que debería realizar el globbing en este caso.find
solución: usar en-exec grep "pattern" {} +
lugar de| xargs grep "pattern"
es más robusto (maneja nombres de archivo con espacios, por ejemplo) y más eficiente.Usando
{html,php,htm}
sólo puede funcionar como una expansión de llaves , que es un no estándar (no compatible con POSIX) característica debash
,ksh
yzsh
.En otras palabras: no intente usarlo en un script que tenga como objetivo
/bin/sh
, use múltiples argumentos explícitos--include
en ese caso.grep
en sí mismo no comprende la{...}
notación.Para que se reconozca una expansión de llaves, debe ser un token sin comillas (parte de a) en la línea de comando.
Una expansión de llaves se expande a múltiples argumentos , por lo que, en el caso que nos ocupa,
grep
termina viendo múltiples--include=...
opciones, como si las hubiera pasado individualmente.Los resultados de una expansión de llaves están sujetos a globbing (expansión de nombre de archivo) , que tiene dificultades :
Cada argumento resultante podría expandirse aún más a nombres de archivo coincidentes si contiene metacaracteres globales sin comillas como
*
.Si bien esto es poco probable con tokens como
--include=*.html
(por ejemplo, tendría que tener un archivo con un nombre literalmente similar--include=foo.html
para que algo coincida), vale la pena tenerlo en cuenta en general.Si la
nullglob
opción de shell está activada (shopt -s nullglob
) y el globbing no coincide con nada , el argumento se descartará .Por lo tanto, para una solución completamente robusta , use lo siguiente:
'--include=*.'
se trata como literal , debido a que está entre comillas simples ; esto evita la interpretación inadvertida de*
un carácter globular.{html,php,htm}
, la - por necesidad - expansión de llaves sin comillas [1] , se expande a 3 argumentos que, debido a{...}
que siguen directamente al'...'
token , incluyen ese token.Por lo tanto, después de que el shell elimine las comillas, los siguientes 3 argumentos literales se pasan finalmente a
grep
:--include=*.html
--include=*.php
--include=*.htm
[1] Más exactamente, son solo las partes relevantes para la sintaxis de la expansión de llaves las que deben estar sin comillas, los elementos de la lista aún pueden estar entrecomillados individualmente y deben serlo si contienen metacaracteres globbing que podrían resultar en globbing no deseado después de la expansión de llaves; aunque no es necesario en este caso, lo anterior podría escribirse como
'--include=*.'{'html','php','htm'}
fuente
bash
en cualquier plataforma que sebash
ejecute.Intente eliminar las comillas dobles
fuente
grep --include=\*.{html,php,htm} pattern -R /some/path
. Funcionó para mí.esto no esta funcionando?
fuente
Prueba esto. -r hará una búsqueda recursiva. -s suprimirá los errores de archivo no encontrado. -n le mostrará el número de línea del archivo donde se encuentra el patrón.
fuente
-I
al conjunto estándar. Omite archivos binarios (que casi nunca se buscan), por lo que aumenta la eficiencia. Luego vamos,grep -rIns ...
que acústicamente suena muy bien :)Funciona con el mismo propósito, pero sin
--include
opción. También funciona en grep 2.5.1.fuente
Usar
grep
confind
comandoTambién puede utilizar
-regex
y-regextype
opciones.fuente