Qual é a diferença entre usar '+' (mais) e ';' (ponto e vírgula) no comando -exec?

28

Gostaria de saber que diferença existe entre usar +e ;no final do -execcomando quando eu uso o findcomando?

find .... -exec ... \; 

VS

find .... -exec ... + 
αғsнιη
fonte

Respostas:

36

-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 findsão encadeados como um xargscomando. 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.

Oli
fonte
4
Exemplo: com \;, o comando executado seria cat 1; cat 2; cat 3. Com +, o comando executado seria cat 1 2 3.
precisa
AFAIK, +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. :)
Simon Richter
Oh legal, obrigado pela informação. Normalmente, -exec <command> {} ';'porque é mais fácil digitar (posso tocar no tipo, mas não tenho exatamente a melhor técnica).
hanetzer
2
@ SimonRichter: Não, -exec ... {} +é POSIX. Veja: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@SimonRichter A -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).
Oli