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 find
en 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 find
en el directorio actual. Estoy usando OS X, 10.9.
Respuestas:
El problema es que no citó su -name
parámetro. Haz esto en su lugar:
find . -name '*.java'
Explicación
Sin las comillas, el shell interpreta *.java
como 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.java
en el directorio actual, find
la 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 find
tal cual.
Por cierto, si el glob no pudo coincidir (no hay *.java
archivos 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 nullglob
opción en Bash , por ejemplo):
find
, exhibirá (accidentalmente) un comportamiento correcto.find
se 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'
-follow
es un sinónimo más legible para -L
, siempre y cuando lo pongas antes de los otros parámetros.
Escapar del *
find . -name \*.java