De man find
:
comando -exec;
Executar comando; true se 0 status for retornado. Todos os seguintes argumentos a serem encontrados são considerados argumentos para o comando até um argumento que consiste em ';' é encontrado. A string '{}' é substituída pelo nome do arquivo atual sendo processado em todos os lugares em que ocorre nos argumentos do comando, não apenas nos argumentos em que está sozinho, como em algumas versões do find. Ambas as construções podem precisar ser escapadas (com um '\') ou citadas para protegê-las da expansão pelo shell. Veja a seção EXEMPLES sec para exemplos de uso da opção '-exec'. O comando especificado é executado uma vez para cada arquivo correspondente.
O comando é executado no diretório inicial. Existem problemas de segurança inevitáveis em torno do uso da opção -exec;
comando -exec {}
Essa variante da opção -exec executa o comando especificado nos arquivos selecionados, mas a linha de comando é criada anexando cada nome de arquivo selecionado no final ; o número total de invocações do comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída da mesma maneira que o xargs cria suas linhas de comando. Somente uma instância de '{}' é permitida dentro do comando. O comando é executado no diretório inicial.
Portanto, pelo que entendi, \;
executa um comando separado para cada arquivo encontrado por find
, enquanto \+
anexa os arquivos e executa um único comando em todos eles. O \
é um caractere de escape, então é:
ls testdir1; ls testdir2
vs
ls testdir1 testdir2
Fazer o acima no meu shell espelhava a saída na sua pergunta.
exemplo de quando você gostaria de usar \+
Suponha dois arquivos 1.tmp
e 2.tmp
:
1.tmp:
1
2
3
2.tmp:
0
2
3
Com \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Considerando que se você usar \+
(para concatenar os resultados de find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
Portanto, neste caso, é a diferença entre diff 1.tmp; diff 2.tmp
ediff 1.tmp 2.tmp
Há casos em que \;
é apropriado e \+
será necessário. O uso de \+
with rm
é uma instância em que, se você estiver removendo um grande número de arquivos, o desempenho (velocidade) será superior \;
.