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.