A questão é dividida em duas partes:
- como não
find conseguem programas de chamadas usando -execsem funcionar em problemas com espaços incorporados em nomes de arquivos, e
- que bom é a
-print0opção?
Para o primeiro, findestá fazendo uma chamada de sistema, na verdade uma de um grupo de chamadas relacionadas, chamadas de "exec" . Ele passa o nome do arquivo como argumento diretamente para esta chamada, que é passada diretamente (após a criação de um novo processo) sem perder informações sobre o nome do arquivo.
O findrecurso POSIX +é explicado da seguinte forma, na lógica :
Um recurso do findutilitário do SVR4 era o -execterminador + do primário. Isso permitiu que nomes de arquivos contendo caracteres especiais (especialmente caracteres de nova linha ) fossem agrupados sem os problemas que ocorrem se esses nomes de arquivo forem canalizados xargs. Outras implementações adicionaram outras maneiras de contornar esse problema, principalmente o -print0primário que gravou nomes de arquivos com um terminador de bytes nulos. Isso foi considerado aqui, mas não adotado. O uso de um terminador nulo significava que qualquer utilitário que processasse a -print0saída da localização
precisava adicionar uma nova opção para analisar os terminadores nulos que agora estaria lendo.
Que " notavelmente um -print0primário" se refere ao GNU finde xargsque resolve o problema de uma maneira diferente. Também é suportado pelo FreeBSD finde xargs. Se você adicionou uma -0opção (consulte a página do manual ) à xargschamada, esse programa aceita linhas terminadas com caracteres de "byte nulo". Por sua vez, xargschama exec -funtions para fazer seu trabalho. A distinção principal entre a -print0e -0característica versus a +característica é que o primeiro passa os nomes de arquivo ao longo de um tubo, enquanto que o último não o faz. Os desenvolvedores encontram usos para quase qualquer recurso; os tubos não são excepção.
De volta ao exemplo do OP, que usa uma -topção para cp: que não é encontrada no POSIX cp . Pelo contrário, é uma extensão (também conhecida como "característica não padronizada") fornecida pelo GNU cp . A -0extensão de xargsnão melhoraria este exemplo, mas há outros casos em que ele pode ser usado com eficiência - tendo em mente que existe a alternativa portátil +, que o GNU findaceita.
find..execpode lidar com nomes estranhos em seu próprio ..