A questão é em duas partes:
- como o
find consegue chamar programas usando -exec sem ter problemas com espaços incorporados em nomes de arquivos, e
- qual é a opção
-print0 ?
No primeiro, find está fazendo uma chamada de sistema, na verdade, um de um grupo de chamadas relacionadas, chamado de " exec ". Ele passa o nome do arquivo como um argumento diretamente para essa chamada, que é passada diretamente (depois de criar um novo processo) sem perder informações sobre o nome do arquivo.
O recurso POSIX find + é explicado da seguinte forma, no < href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/find.html#tag_20_47_18"> lógica :
A feature of SVR4's find utility was the -exec primary's +
terminator. This allowed filenames containing special characters
(especially newline characters) to be grouped together without the
problems that occur if such filenames are piped to xargs. Other
implementations have added other ways to get around this problem,
notably a -print0 primary that wrote filenames with a null byte
terminator. This was considered here, but not adopted. Using a null
terminator meant that any utility that was going to process find's
-print0 output had to add a new option to parse the null terminators
it would now be reading.
Que " notavelmente a -print0 primary" refere-se ao GNU find e xargs que resolvem o problema de uma maneira diferente. Também é suportado pelo FreeBSD find e xargs . Se você adicionou uma opção -0 (consulte a página de manual ) ao xargs call, então esse programa aceita linhas terminadas por caracteres "byte nulo". Por sua vez, xargs chama as funções exec para fazer o trabalho its . A principal distinção entre o recurso -print0 e -0 versus o recurso + é que o primeiro passa os nomes de arquivo por um pipe, enquanto o segundo não passa. Os desenvolvedores encontram usos para quase todos os recursos; os canos não são exceção.
Voltar ao exemplo de OP, que usa a opção -t para cp : que não é encontrada em POSIX cp . Pelo contrário, é uma extensão (também conhecida como "recurso não padrão") fornecida pelo GNU cp . A extensão -0 de xargs não melhoraria este exemplo, mas há outros casos em que ela pode ser usada com eficácia, lembrando que existe a alternativa portátil + , que o GNU find aceita.