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 ---include
en ese caso.grep
no 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=*.html
que tener un archivo literalmente llamado algo como--include=foo.html
para que coincida con algo), vale la pena tenerlo en cuenta general.Si la opción de
nullglob
shell 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
.