La comilla doble utilizada con el valor coincidente con el parámetro -name en buscar

La comilla doble utilizada con el valor coincidente con el parámetro -name en buscar

¿Por qué el valor coincidente con el parámetro -namein finddebe marcarse entre comillas dobles?

# find / -type f -name *.out |wc -l 1>mv.out                                  
0403-027 The parameter list is too long.
# cat mv.out                                                   
       0
# find / -type f -name "*.out" |wc -l 1>mv.out                                   
# cat mv.out                                                                                           
  146302

Respuesta1

Sin comillas dobles, *.outel shell lo expande, lo que significa que se reemplaza por todos los nombres de archivo en el directorio actual que coincidan *.out(principalmente cualquier archivo que termine con .outun punto y no comience con él). En su caso, parece haber al menos dos archivos coincidentes que se pasan findcomo parámetros. findno sabe qué hacer con ellos y se queja de que la lista de parámetros es demasiado larga.

Al citar el patrón, el shell lo deja como está, simplemente elimina las comillas y findve un parámetro intacto *.out, que es lo que probablemente pretendía.

Respuesta2

No estoy seguro de si esto es exactamente correcto. Pero creo que ponerlo entre comillas hace que el analizador lo lea como una expresión regular. Sin comillas, creo que el asterisco representa todos los archivos del directorio actual.

Compruebe la diferencia de salida entre:

$ echo $(find ./ -name *)

y

$ echo $(find ./ -name "*")

Entonces, con el primer comando probablemente obtendrás un error. Si tienes los archivosfoo&baren el directorio actual, el asterisco representa los nombres de los archivos. Entonces el analizador de comandos leería el comando así:

$ echo $(find ./ -name foo bar)

Y la salida de error sería find: bar: unknown primary or operator.

El segundo comando lee el asterisco como una expresión regular, lo que indica la búsqueda de cualquier nombre de archivo.

Editar:Aunque ahora, después de probar más los comandos, parece que en mi sistema funciona independientemente de que el valor del argumento esté entre comillas o no, siempre que algo de texto se combine con el asterisco:

$ echo $(find ./ -name *foo)

es lo mismo que

$ echo $(find ./ -name "*foo")

¿Quizás entendí mal la pregunta?

información relacionada