Si tengo un directorio que contiene algunos archivos cuyos nombres tienen espacios, por ejemplo
$ ls -1 dir1
file 1
file 2
file 3
Puedo copiarlos con éxito a otro directorio como este:
$ find dir1 -mindepth 1 -exec cp -t dir2 {} +
Sin embargo, la salida de find dir1 -mindepth 1
contiene espacios sin escape:
$ find dir1 mindepth 1
dir1/file 1
dir1/file 3
dir1/file 3
Si uso en print0
lugar de print
, la salida todavía contiene espacios sin escape:
$ find dir1 mindepth 1 -print0
dir1/file 1dir1/file 2dir1/file 3
Para copiar estos archivos manualmente usando cp
, necesitaría escapar de los espacios; pero parece que esto es innecesario cuando cp
provienen los agumentos find
, independientemente de si uso +
o \;
al final del comando.
¿Cuál es la razón de esto?
find..exec
puede manejar nombres de archivos extraños en su propia ..La pregunta es de dos partes:
find
arregla para llamar a los programas usando-exec
sin tener problemas con los espacios incrustados en los nombres de archivo, y-print0
opción?Para el primero,
find
está haciendo una llamada al sistema, en realidad una de un grupo de llamadas relacionadas a las que se hace referencia como "exec" . Pasa el nombre de archivo como argumento directamente a esta llamada, que luego se pasa directamente (después de crear un nuevo proceso) sin perder información sobre el nombre de archivo.La
find
característica POSIX+
se explica de la siguiente manera, en la justificación :Que " notablemente un
-print0
primario" se refiere a GNUfind
yxargs
que resuelve el problema de una manera diferente. También es compatible con FreeBSDfind
yxargs
. Si agregó una-0
opción (consulte la página del manual ) a laxargs
llamada, ese programa acepta líneas terminadas con caracteres de "byte nulo". A su vez,xargs
llama a exec -functions para que haga su trabajo. La distinción principal entre el-print0
y-0
característica frente a la+
característica es que el primero pasa a los nombres de archivo más de una tubería, mientras que el segundo no. Los desarrolladores encuentran usos para casi cualquier característica; Las tuberías no son la excepción.Volviendo al ejemplo de OP, que utiliza una
-t
opción paracp
: eso no se encuentra en POSIX cp . Más bien, es una extensión (también conocida como "característica no estándar") proporcionada por GNU cp . La-0
extensión dexargs
no mejoraría este ejemplo, pero hay otros casos en los que se puede usar de manera efectiva, teniendo en cuenta que existe una alternativa portátil+
, que GNUfind
acepta.fuente
( Esto debería ser un comentario pero es demasiado grande ) .
Para aquellos que les gusta probar cosas:
Cree un script que enumere los parámetros posicionales pasados, llámelo
list_positional_parameters.sh
.Ejecútelo
find
en algún directorio $ dir:Como se esperaba, solo hay un único parámetro en todas las llamadas, el nombre de archivo, si hay espacios en su nombre o no.
fuente
printf
likeprintf '"%s"\n' "$@"
para imprimir todos los argumentos posicionales citados, para inspección visual.