¿Por qué mi hallazgo no es recursivo?

65

Estoy ejecutando el siguiente comando, pero no se realiza de forma recursiva:

find . -name *.java

Sé que hay archivos java más abajo en el directorio actual, pero solo se está ejecutando finden el directorio actual. Estoy usando OS X, 10.9.

usuario11498
fuente
@Gilles: este Q&A es mucho más claro y menos localizado que el engañado: si uno de ellos debe cerrarse, es el otro.
Ricitos

Respuestas:

88

El problema es que no citó su -nameparámetro. Haz esto en su lugar:

find . -name '*.java'

Explicación

Sin las comillas, el shell interpreta *.javacomo un patrón global y lo expande a cualquier nombre de archivo que coincida con el global antes de pasarlo find. De esta manera, si tuviera, por ejemplo, foo.javaen el directorio actual, findla línea de comando real sería:

find . -name foo.java

que obviamente enumeraría el archivo en el directorio actual solamente (a menos que tenga algunos archivos con nombres similares más abajo en el árbol).

Las comillas evitan la expansión global y pasan la línea de comando findtal cual.

Por cierto, si el glob no pudo coincidir (no hay *.javaarchivos en el directorio actual), obtendría uno de dos comportamientos dependiendo de cómo esté configurado su shell para manejar los glob que no coinciden (esto se rige por la nullglobopción en Bash , por ejemplo):

  1. Si el globo no expande un globo que no coincide find, exhibirá (accidentalmente) un comportamiento correcto.
  2. Si el shell expande un globo que no coincide en una cadena vacía, findse quejará de que le falta un argumento -name.
Joseph R.
fuente
20

Tuve una situación similar en la que rodeaba el valor -name entre comillas, pero aún no obtenía todos los resultados de búsqueda que esperaba. Supuse que se debía a enlaces simbólicos y, efectivamente, ese era el caso. Si desea forzar la búsqueda para buscar a través de enlaces simbólicos, puede modificar el comando a lo siguiente:

find -L . -name '*.java'
gaoagong
fuente
Los enlaces simbólicos también fueron mi problema. -followes un sinónimo más legible para -L, siempre y cuando lo pongas antes de los otros parámetros.
Noumenon
0

Escapar del *

find . -name \*.java
Stuart Cardall
fuente