-exec ... \;
executará um item após o outro. Então, se você tiver três arquivos, a linha exec será executada três vezes.
-exec ... {} +
é para comandos que podem levar mais de um arquivo por vez (por exemplo, cat
, stat
, ls
). Os arquivos encontrados por find
são encadeados como um comando xargs
. Isso significa menos bifurcação e, para pequenas operações, pode significar uma aceleração substancial.
Aqui está uma demonstração de desempenho com 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 só funciona em comandos que podem receber vários nomes de arquivos. Você pode descobrir se seu comando é assim, olhando para a sua página de manual. Aqui está a sinopse de man cat
:
SYNOPSIS
cat [OPTION]... [FILE]...
As reticências em [FILE]...
significam que pode demorar 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.