shell - ejemplos - lista completa de comandos linux pdf
¿Cómo utilizo la opción grep--include para múltiples tipos de archivos? (6)
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 grep todos los archivos html, htm, php en algún directorio?
A partir de este uso grep --exclude / - incluye 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 grep es 2.5.1.
¿Esto no funciona?
grep pattern /some/path/*.{html,php,htm}
El uso de {html,php,htm} solo puede funcionar como una expansión de llaves , que es una función no estándar (que no cumple con POSIX) de bash , ksh y zsh .
En otras palabras: no intente usarlo en un script que se dirija a
/bin/sh: utilice argumentos explícitos múltiples ---includeen ese caso.grepno comprende la notación{...}.
Para que se reconozca una expansión de llaves, debe ser un token sin comillas (parte de una) 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 opciones --include=... , como si las --include=... 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 nombres de archivos coincidentes si contiene metacaracteres globbing sin comillas como
*.
Si bien esto es poco probable con tokens como--include=*.html(por ej.,--include=*.htmlque tener un archivo literalmente llamado algo como--include=foo.htmlpara que coincida con algo), vale la pena tenerlo en cuenta general.Si la opción de
nullglobshell está activada (shopt -s nullglob) y globbing no coincide con nada , el argumento será descartado .
Por lo tanto, para una solución completamente robusta , use lo siguiente:
grep -R ''--include=*.''{html,php,htm} pattern /some/path
''--include=*.''se trata como un literal , debido a que se cita solo ; esto evita la interpretación inadvertida de*como un personaje globbing.{html,php,htm}, la necesidad de expansión de llaves sin cita [1] , se expande a 3 argumentos, que, debido a{...}directamente después del token''...'', incluyen ese token.Por lo tanto, después de la eliminación de la cita por el shell, los siguientes 3 argumentos literales finalmente se pasan a
grep:-
--include=*.html -
--include=*.php -
--include=*.htm
-
[1] Más exactamente, solo las partes relevantes de la sintaxis de la expansión de corchete deben ser sin comillas, los elementos de la lista aún pueden ser citados individualmente y deben serlo si contienen metacaracteres globbing que podrían resultar en globbing indeseados después de la expansión del corsé; aunque no es necesario en este caso, lo anterior podría escribirse como
''--include=*.''{''html'',''php'',''htm''}
Intenta eliminar las comillas dobles
grep --include=*.{html,php,htm} pattern -R /some/path
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.
grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}
Puede usar múltiples --include flags. Esto funciona para mí:
grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/
Sin embargo, puedes hacer lo que sugirió Deruijter . Esto funciona para mí:
grep -r --include=*.{html,php,htm} "pattern" /some/path/
No olvide que puede usar find y xargs para este tipo de cosas para:
find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
HTH
Usa grep con el comando find
find /some/path -name ''*.html'' -o -name ''*.htm'' -o -name ''*.php'' -type f
-exec grep PATTERN {} /+
También puede usar las opciones de tipo -regex y -regextype .