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 ):

  1. Si un glob que no coincide no es expandido por el shell, find exhibirá (accidentalmente, fíjate) un comportamiento correcto.
  2. 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

  • Los enlaces simbólicos también eran mi problema. -follow es un sinónimo más legible para -L, siempre que lo coloques antes de los otros parámetros.
  • Genial ! ¡¡Muchas gracias!! +1!

Responder

Escapa del *

find . -name \*.java 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *