¿Cómo puedo recursivamente grep archivos particulares en un directorio?

14

Soy nuevo en Linux y Grep, e intento encontrar el camino.

Al usar, find -name *.javapuedo encontrar los nombres de todos los archivos java en un directorio particular. Supongamos que quiero contar la cantidad de veces que fooocurre en estos archivos, ¿cómo lo haría?

He estado intentando cosas como:

grep -r "foo" *.java

y obteniendo respuestas como:

grep:  *.java:  No such file or directory

¿Algunas ideas?

Eric Wilson
fuente
1
Lo siento, me veré más duro la próxima vez. Notable que las preguntas fueran tan similares.
Eric Wilson
1
El título de 3512 podría ser mucho mejor. La "pregunta básica de uso de grep" no le dice mucho acerca de la pregunta real. Probablemente tendremos más engaños a menos que eso se solucione.
Richard Hoskins el
1
@richardhoskins, arreglado.
John T

Respuestas:

16
find . -name '*.java' | xargs grep <your pattern here>
Arathorn
fuente
55
Mejor aún, use elementos terminados en nulo para que un nombre de archivo con un espacio no se divida en dos nombres de archivo: buscar. -name '* .java' -tipo f -print0 | xargs -0 grep <su patrón aquí>
CoverosGene
1
@CoverosGene: Puede usar la opción --replace a xargs para manejar eso - así: ... | xargs --replace grep "{}" <patrón>
arathorn
muchas gracias, sabía que debe haber un comando que haga lo que xargshace.
Eric Wilson
6

Existe una herramienta especialmente diseñada para este tipo de necesidad: ack .

ack es una herramienta como grep, dirigida a programadores con grandes árboles de código fuente heterogéneo

Lea también las "10 razones principales para usar ack en lugar de grep". en la página de ack .

usuario4126
fuente
1
Meh Una herramienta Unix real necesita un nombre recursivo que haga referencia a su herencia ... como abtg [ABTG's Better Than Grep], o algo así. ACK? Lo único bueno es que el autor del NACK mejorado ya tiene un nombre elegido;)
Mikeage
Una de las razones por las que realmente amo ack es que puedes especificar tipos de archivos. Por ejemplo, yo con "ack --html <patrón>" busca todos mis archivos .html, .htm, .xhtml, .dhtml, etc. de una sola vez.
Mark van Lent
Ack ha reemplazado a grep para mí.
Ryan C. Thompson
3

Qué pasa:

grep -irn --include="*\.java" somePhrase *
Manatok
fuente
0

encontrar . -type f -name '* .java' -print0 | xargs -0 grep -wo 'foo' | wc -l

wudeng
fuente
3
¡Bienvenido a SuperUser! Encontrará que sus respuestas reciben más atención cuando se trata de preguntas más actuales (esta es de 2009) y cuando explica por qué su respuesta es mejor que la ya aceptada.
Eric Wilson