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.
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.
Respuestas:
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):
find, exhibirá (accidentalmente) un comportamiento correcto.findse quejará de que le falta un argumento -name.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'
-followes un sinónimo más legible para -L, siempre y cuando lo pongas antes de los otros parámetros.
Escapar del *
find . -name \*.java