La pregunta es de dos partes:
- ¿ Cómo se las
find arregla para llamar a los programas usando -execsin tener problemas con los espacios incrustados en los nombres de archivo, y
- ¿de qué sirve la
-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 :
Una característica de la findutilidad de SVR4 era el -execterminador + 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 -print0primaria 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 -print0salida de find
tenía que agregar una nueva opción para analizar los terminadores nulos que ahora estaría leyendo.
Que " notablemente un -print0primario" se refiere a GNU findy xargsque resuelve el problema de una manera diferente. También es compatible con FreeBSD findy xargs. Si agregó una -0opción (consulte la página del manual ) a la xargsllamada, 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 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 -0extensión de xargsno 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 findacepta.
find..execpuede manejar nombres de archivos extraños en su propia ..