grep todos los archivos .java en un directorio para una cadena particular

12

¿Cómo buscaría en todos los archivos .java una cadena simple (no una expresión regular) en el directorio actual y todos los subdirectorios en Mac OS X? Solo quiero imprimir una lista de nombres de archivos y directorios que coincidan.

John Topley
fuente
Gracias por preguntar esto, así que no tengo que hacerlo. Ahora solo tengo que descubrir cómo excluir ".git" y he terminado por un momento.
Dan Rosenstark el
Creo que la respuesta de js es más concisa, todavía apesta, tienes que escribir, incluyendo, pero aún así. Probablemente podría escribir un alias para ocultar eso
Craig Tataryn

Respuestas:

19

Y el siempre popular

find . -name '*.java' | xargs grep -l 'string'

EDITAR (por Frank Szczerba):

Si se trata de nombres de archivos o directorios que tienen espacios, la forma más segura de hacerlo es:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

Siempre hay más de una forma de hacerlo.

David Mackintosh
fuente
11

La respuesta tradicional de UNIX sería la que fue aceptada para esta pregunta:

find . -name '*.java' | xargs grep -l 'string'

Esto probablemente funcionará para archivos Java, pero los espacios en los nombres de archivos son mucho más comunes en Mac que en el mundo tradicional de UNIX. Cuando los nombres de archivo con espacios se pasan a través de la tubería anterior, xargs interpretará las palabras individuales como nombres diferentes.

Lo que realmente quieres es separar nul los nombres para que los límites no sean ambiguos:

find . -name '*.java' -print0 | xargs -0 grep -l 'string'

La alternativa es dejar que find ejecute grep por usted, como sugiere Mark, aunque ese enfoque es más lento si está buscando una gran cantidad de archivos (ya que grep se invoca una vez por archivo en lugar de una vez con la lista completa de archivos).

Frank Szczerba
fuente
También puede usar la opción "--replace" en xargs para tratar con nombres de archivos que tienen espacios en ellos: ... | xargs --replace grep 'string' '{}' ({} sería reemplazado por el nombre del archivo)
arathorn
1
Las versiones modernas de find (incluida la instalada en OS X) admiten "-exec <command> {} +" donde el signo más al final (en lugar de \;) le dice a find que reemplace {} con "tantos nombres de ruta como sea posible ... Esto es similar al de xargs (1) "(de la página del manual).
Doug Harris el
7

Use el grep que es mejor que grep, ack :

ack -l --java  "string" 
bortzmeyer
fuente
3
ack no está instalado en Mac OS X de forma predeterminada.
John Topley el
No sé qué significa "por defecto". En muchos sistemas operativos, usted elige lo que instala, por lo que es difícil encontrar programas que siempre estén presentes. A la vez, un compilador de C siempre estaba ahí y Perl era raro ...
Bortzmeyer
1
Significa que es parte de la instalación estándar del sistema operativo. Tengo las herramientas de desarrollador instaladas en mi Mac y no se instalan ack. Tienes que instalarlo tú mismo. Si lo tiene, entonces es una buena sintaxis.
John Topley el
En el caso de ack, es un solo programa Perl sin dependencias de módulos. Si puede "instalar" programas en su directorio ~ / bin, puede "instalar" con la misma facilidad.
Andy Lester
4

En realidad, esto usará una expresión regular si lo desea, simplemente manténgase alejado de los metacaracteres o escape de ellos, y puede buscar cadenas.

find . -iname "*.java" -exec egrep -il "search string" {} \;

Mark Thalman
fuente
3
grep -rl --include="*.java" simplestring *
js.
fuente
1
Esta parece ser la mejor respuesta aquí: si grep lo hace todo, ¿por qué usar find & xargs?
Peter Gibson
Para su información, dado lo que se pregunta en la pregunta, debe ser pequeña "l" no grande "L" en ese comando
Craig Tataryn
Craig tiene razón, corrigí mi respuesta.
js.
1

Dado que esta es una pregunta de OSX, aquí hay una respuesta más específica de OSX.

Saltar findy usar Spotlightdesde la línea de comando. Mucho más poderoso!

FOCO DE LA LÍNEA DE MANDO - ENCUENTRE CON GREP

La mayoría de las personas no saben que puedes hacer búsquedas de Spotlight desde la línea de comandos. ¿Por qué recordar todas las opciones arcanas de búsqueda y grep y qué no cuando puedes dejar que Spotlight haga el trabajo por ti? La interfaz de línea de comando para Spotlight se llama mdfind. ¡Tiene el mismo poder que la búsqueda de GUI Spotlight y más porque es programable en la línea de comando!


fuente
0

Prueba esto:

grep -rl "string" */*java
dwj
fuente
1
Esto proporciona "grep: * / * java: No existe tal archivo o directorio" en Mac OS X.
John Topley
El problema aquí es que solo encontrará archivos * .java de un nivel de profundidad. Vea la respuesta de Mark Thalman para mi humilde opinión la forma correcta de hacerlo.
Ludwig Weinzierl el
Lo siento, no en mi Mac. ¿La versión para Mac de grep no tiene el indicador -r (recursivo)?
dwj
Lo hace, pero ese fue el resultado que obtuve al buscar una cadena que sé que está en los archivos.
John Topley
0

También podría usar un programa GUI como TextWrangler para hacer una búsqueda más intuitiva de dónde están las opciones en la interfaz.

Mark Thalman
fuente
0
grep "(your string)" -rl $(find ./ -name "*.java")

Si desea ignorar mayúsculas y minúsculas, reemplace -rl con -irl. (su cadena) también puede ser una expresión regular si alguna vez ve la necesidad.

hombre_ risas
fuente