Respostas:
-exec ... \;
executará um item após o outro. Portanto, se você tiver três arquivos, a linha exec será executada três vezes.
-exec ... {} +
é para os comandos que podem levar mais de um arquivo ao mesmo tempo (por exemplo cat
, stat
, ls
). Os arquivos encontrados por find
são encadeados como um xargs
comando. Isso significa menos bifurcação e para pequenas operações, pode significar uma aceleração substancial.
Aqui está uma demonstração de desempenho, gerando 10.000 arquivos vazios.
$ mkdir testdir
$ touch testdir/{0000..9999}
$ time find testdir/ -type f -exec cat {} \;
real 0m8.622s
user 0m0.452s
sys 0m8.288s
$ time find testdir/ -type f -exec cat {} +
real 0m0.052s
user 0m0.015s
sys 0m0.037s
Novamente, isso funciona apenas em comandos que podem receber vários nomes de arquivos. Você pode descobrir se seu comando é assim, olhando para a página de manual. Aqui está a sinopse de man cat
:
SYNOPSIS
cat [OPTION]... [FILE]...
As reticências ativadas [FILE]...
significam que pode levar mais de um arquivo.
+
só pode ser usado em comandos únicos e você deve ter exatamente um {}
na linha. \;
pode operar com vários grupos de zero a muitos.
+
não é POSIX, portanto, pode não estar disponível em sistemas não Linux. Não é uma preocupação se você nunca sai da plataforma, mas é bom saber se você precisa usar o Solaris. :)
-exec <command> {} ';'
porque é mais fácil digitar (posso tocar no tipo, mas não tenho exatamente a melhor técnica).
-exec ... {} +
é POSIX. Veja: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
-exec ... {} +
extensão foi sugerida para inclusão nas especificações do POSIX em 2001 e ratificada na edição 6 do POSIX em 2004. É possível que a versão do Solaris com a qual você esteja acostumado seja mais antiga que o padrão do POSIX (ou apenas tenha como alvo uma versão anterior).
\;
, o comando executado seriacat 1; cat 2; cat 3
. Com+
, o comando executado seriacat 1 2 3
.