La pregunta es de dos partes:
- ¿ Cómo se las
find
arregla para llamar a los programas usando -exec
sin tener problemas con los espacios incrustados en los nombres de archivo, y
- ¿de qué sirve la
-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 :
Una característica de la find
utilidad de SVR4 era el -exec
terminador + primario. Esto permitió que los nombres de archivo que contenían caracteres especiales (especialmente los caracteres de nueva línea ) se agruparan sin los problemas que se producen si se canalizan dichos nombres de archivo xargs
. Otras implementaciones han agregado otras formas de solucionar este problema, especialmente una -print0
primaria que escribió nombres de archivo con un terminador de bytes nulo. Esto se consideró aquí, pero no se adoptó. El uso de un terminador nulo significaba que cualquier utilidad que procesara la -print0
salida de find
tenía que agregar una nueva opción para analizar los terminadores nulos que ahora estaría leyendo.
Que " notablemente un -print0
primario" se refiere a GNU find
y xargs
que resuelve el problema de una manera diferente. También es compatible con FreeBSD find
y xargs
. Si agregó una -0
opción (consulte la página del manual ) a la xargs
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 para cp
: 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 de xargs
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 GNU find
acepta.
find..exec
puede manejar nombres de archivos extraños en su propia ..