Estoy ejecutando el siguiente comando, pero no se ejecuta de forma recursiva:
find . -name *.java
Sé que hay archivos java más abajo en el directorio actual, pero está ejecutando find
solo en el directorio actual. Estoy usando OS X, 10.9.
Respuesta
El problema es que no citó su . Haga esto en su lugar:
find . -name "*.java"
Explicación
Sin las comillas, el shell interpreta *.java
como un patrón glob y lo expande a cualquier nombre de archivo que coincida con el glob antes de pasarlo a find
. De esta manera, si tuviera, digamos, foo.java
en el directorio actual, find
«s 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 algún nombre similar archivos más abajo en el árbol).
Las comillas previenen la expansión global y pasan la línea de comando a find
tal cual.
Por cierto, si el glob no había coincidido (no hay archivos *.java
en la dirección actual tory), obtendría uno de dos comportamientos dependiendo de cómo esté configurado su shell para manejar globs que no «coinciden (esto se rige por la opción nullglob
en Bash, por ejemplo ):
- Si un glob que no coincide no es expandido por el shell,
find
exhibirá (accidentalmente, fíjate) un comportamiento correcto. - Si un glob que no coincide es expandido en una cadena vacía por el shell,
find
se quejará de que falta un argumento para-name
.
Responder
Tuve una situación similar en la que estaba rodeando el -nombre valor entre comillas, pero todavía no obtenía todos los resultados de búsqueda que esperaba. Conjeturé que se debía a los enlaces simbólicos y, efectivamente, ese era el caso. Si desea forzar la búsqueda a buscar a través de enlaces simbólicos, puede modificar el comando a lo siguiente:
find -L . -name "*.java"
Comentarios
Responder
Escapa del *
find . -name \*.java
-follow
es un sinónimo más legible para-L
, siempre que lo coloques antes de los otros parámetros.