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.htmlse 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.findsolució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,kshyzsh.En otras palabras: no intente usarlo en un script que tenga como objetivo
/bin/sh, use múltiples argumentos explícitos--includeen ese caso.grepen 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,
greptermina 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.htmlpara que algo coincida), vale la pena tenerlo en cuenta en general.Si la
nullglobopció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
bashen cualquier plataforma que sebashejecute.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
-Ial 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
--includeopción. También funciona en grep 2.5.1.fuente
Usar
grepconfindcomandoTambién puede utilizar
-regexy-regextypeopciones.fuente