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 1contiene espacios sin escape:
$ find dir1 mindepth 1
dir1/file 1
dir1/file 3
dir1/file 3
Si uso en print0lugar 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 cpprovienen los agumentos find, independientemente de si uso +o \;al final del comando.
¿Cuál es la razón de esto?

find..execpuede manejar nombres de archivos extraños en su propia ..La pregunta es de dos partes:
findarregla para llamar a los programas usando-execsin tener problemas con los espacios incrustados en los nombres de archivo, y-print0opción?Para el primero,
findestá 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
findcaracterística POSIX+se explica de la siguiente manera, en la justificación :Que " notablemente un
-print0primario" se refiere a GNUfindyxargsque resuelve el problema de una manera diferente. También es compatible con FreeBSDfindyxargs. Si agregó una-0opción (consulte la página del manual ) a laxargsllamada, ese programa acepta líneas terminadas con caracteres de "byte nulo". A su vez,xargsllama a exec -functions para que haga su trabajo. La distinción principal entre el-print0y-0caracterí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
-topció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-0extensión dexargsno 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 GNUfindacepta.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
finden 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
printflikeprintf '"%s"\n' "$@"para imprimir todos los argumentos posicionales citados, para inspección visual.