@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):
Si el globo no expande un globo que no coincide find, exhibirá (accidentalmente) un comportamiento correcto.
Si el shell expande un globo que no coincide en una cadena vacía, 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:
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.
Respuestas:
El problema es que no citó su
-name
parámetro. Haz esto en su lugar: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 pasarlofind
. De esta manera, si tuviera, por ejemplo,foo.java
en el directorio actual,find
la línea de comando real sería: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 lanullglob
opción en Bash , por ejemplo):find
, exhibirá (accidentalmente) un comportamiento correcto.find
se quejará de que le falta un argumento-name
.fuente
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:
fuente
-follow
es un sinónimo más legible para-L
, siempre y cuando lo pongas antes de los otros parámetros.Escapar del
*
fuente