A questão é dividida em duas partes:
- como não
find
conseguem programas de chamadas usando -exec
sem funcionar em problemas com espaços incorporados em nomes de arquivos, e
- que bom é a
-print0
opção?
Para o primeiro, find
está 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 find
recurso POSIX +
é explicado da seguinte forma, na lógica :
Um recurso do find
utilitário do SVR4 era o -exec
terminador + 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 -print0
primá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 -print0
saída da localização
precisava adicionar uma nova opção para analisar os terminadores nulos que agora estaria lendo.
Que " notavelmente um -print0
primário" se refere ao GNU find
e xargs
que resolve o problema de uma maneira diferente. Também é suportado pelo FreeBSD find
e xargs
. Se você adicionou uma -0
opção (consulte a página do manual ) à xargs
chamada, esse programa aceita linhas terminadas com caracteres de "byte nulo". Por sua vez, xargs
chama exec -funtions para fazer seu trabalho. A distinção principal entre a -print0
e -0
caracterí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 -t
opçã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 -0
extensão de xargs
nã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 find
aceita.
find..exec
pode lidar com nomes estranhos em seu próprio ..