cómo realizar la operación grep en todos los archivos en un directorio

218

Trabajando con xenserver, y quiero ejecutar un comando en cada archivo que está en un directorio, sacando algunas cosas de la salida del comando y anexándolo en un archivo.

Tengo claro el comando que quiero usar y cómo extraer las cadenas según sea necesario.

Pero lo que no tengo claro es cómo debo ejecutar este comando en cada archivo, pasando al siguiente, hasta que no se encuentren más archivos.

usuario2147075
fuente

Respuestas:

228

grep $PATTERN *Sería suficiente. Por defecto, grep omitiría todos los subdirectorios. Sin embargo, si quieres atravesarlos, grep -r $PATTERN *es el caso.

umi
fuente
37
"grep -r $ PATTERN". es suficiente. Para grep recursivo no necesita especificar todos los archivos
Cougar
1
¿Cómo incluyo múltiples extensiones? P.ej. "* .cpp", "* .h"?
Tomáš Zato - Restablece a Monica el
1
@ Tomáš Zato, simplemente suplir todas sus patrones de ficheros en lugar de *: grep $PATTERN *.cpp *.h. Si necesita reglas más específicas para los archivos que deben seleccionarse, use el findcomando (verifique la respuesta de Rob).
umi
@umi Si ejecuto los grep -r x .resultados provienen de todos los archivos de todas las extensiones. Si corro, grep -r x *.scssno recibo ningún resultado.
Chris
1
@Chris es posible que no tenga *.scssarchivos en el directorio actual pero en algún lugar más profundo en subdirectorios para que grep no busque en todos los archivos que desea. Debe usar la --includeopción para indicarle a grep que busque de forma recursiva archivos que coincidan con patrones específicos: grep -r x --include '*.scss' . (tenga en cuenta las comillas, evitan que el shell expanda el patrón). O simplemente use find(vea la respuesta de Rob).
umi
168

En Linux, normalmente uso este comando para greps recursivamente para un texto en particular dentro de un directorio

grep -rni "string" *

dónde,

r = recursivo, es decir, buscar subdirectorios dentro del directorio actual
n = para imprimir los números de línea en stdout
i = búsqueda sin distinción entre mayúsculas y minúsculas

Narain
fuente
32

Usa find. En serio, es la mejor manera porque entonces realmente puedes ver en qué archivos está funcionando:

find . -name "*.sql" -exec grep -H "slow" {} \;

Tenga en cuenta que -H es específico de mac, muestra el nombre del archivo en los resultados.

Robar
fuente
77
Si decide usar find, canalizar la salida en xargslugar de usar -execesto será mucho más rápido, ya que -execgenera un nuevo proceso para cada grep, y la sobrecarga se vuelve significativa con una gran cantidad de archivos. Se aplican advertencias estándar sobre espacios en los nombres de archivo xargs.
Barton Chittenden
2
¿Cómo se vería esto exactamente? Siempre olvido la xargssintaxis.
Brian Peterson
3
@BrianPeterson sería algo así:find . -iname "*.sql" -print0 | xargs -0 grep "slow"
MediaVince
4

Para buscar en todos los subdirectorios, pero solo en tipos de archivo específicos , use grep con --include.

Por ejemplo, buscando recursivamente en el directorio actual, para texto en * .yml y * .yaml:

grep "text to search" -r . --include=*.{yml,yaml}
Noam Manos
fuente
1

Si quieres hacer múltiples comandos, puedes usar:

for I in `ls *.sql`
do
    grep "foo" $I >> foo.log
    grep "bar" $I >> bar.log
done
Bryan
fuente