grep solo subdirectorios que coinciden con el patrón

9

Tengo un árbol de directorios que consta de varios miles de subdirectorios, pero con frecuencia necesito grep solo un pequeño subconjunto de esos directorios. ¿Cómo puedo grepsolo aquellos subdirectorios que coinciden con un patrón?

Por ejemplo, supongamos que tengo estos subdirectorios que quiero grep:

...
...
...
/foo
/fooLib
/fooHandler
/fooGizmo
...
...
...

Las ...entradas anteriores representan los miles de otros directorios que no quiero incluir.

Suponiendo que estoy buscando todas las instancias de bar, si hago esto:

grep -n --recursive bar *

Encontraría lo que estoy buscando, pero en todos los directorios. ¿Cómo puedo buscar solo en aquellos subdirectorios que coinciden con el patrón foo*?

John Dibling
fuente
¿Quieres buscar solo en /fooy amigos? ¿En /fooy /foo/bary /foo/bar/quxy así sucesivamente pero no /wibble/foo? En /fooy /wibble/foopero no /foo/bar? En /fooy /foo/bary /wibble/foopero no /elsewhere?
Gilles 'SO- deja de ser malvado'

Respuestas:

11

Puede usar grep y encontrar la combinación de la siguiente manera:

find /{foo,fooLib,fooHandler,fooGizmo} -type f -exec grep -l "test" {} \;

O puedes usar

find /foo* -type f -exec grep -l "test" {} \;

O usando solo grep

grep -R "test" /foo*
Rahul Patil
fuente
¿Puedo hacer esto sin especificar los subdirectorios explícitamente? Por el contrario, mediante el uso de un comodín como foo*?
John Dibling
@JohnDibling sí, he actualizado exactamente lo que estás diciendo :)
Rahul Patil
La última sugerencia ( grep -R "test" /foo*) es exactamente lo que estoy haciendo ahora, así que aceptaré.
John Dibling
Gracias por esto. Estoy usando el primer patrón, pero me encantaría entender algunas cosas al respecto, por ejemplo, ¿qué hacen el final {}y la barra diagonal inversa?
random_user_name
Esto proporciona las líneas que coinciden con el grep, pero se pierde la ubicación de los datos (el archivo en el que se encuentra). ¿Hay alguna manera de retener eso?
Jontia el
0

intente, grep foo* <other parts>por ejemplo:grep foo* -name "book*"

harish.venkat
fuente
Si estoy buscando todas las instancias de bartodos los archivos en los subdirectorios nombrados foo*, ¿debería ser así grep --recursive bar ./foo*/*:?
John Dibling