¿Por qué el valor coincidente con el parámetro -name
in find
debe 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, *.out
el 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 .out
un punto y no comience con él). En su caso, parece haber al menos dos archivos coincidentes que se pasan find
como parámetros. find
no 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 find
ve 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?