Se você executar find
com exec
, {}
expandirá para o nome de cada arquivo ou diretório encontrado com find
(para que ls
em seu exemplo obtenha todos os nomes encontrados como argumento - observe que ele chama ls
ou qualquer outro comando que você especificar uma vez para cada arquivo encontrado).
O ponto-e-vírgula ;
encerra o comando executado por exec
. Ele precisa ser escapado com \
para que o shell que você executa find
inside não o trate como seu próprio caractere especial, mas passe-o para find
.
Veja este artigo para alguns mais detalhes.
Além disso, find
fornece alguma otimização com exec cmd {} +
- quando executado assim, find
acrescenta arquivos encontrados ao final do comando em vez de invocá-lo uma vez por arquivo (para que o comando seja executado apenas uma vez, se possível).
A diferença no comportamento (se não na eficiência) é facilmente perceptível se for executada com ls
, por exemplo
find ~ -iname '*.jpg' -exec ls {} \;
# vs
find ~ -iname '*.jpg' -exec ls {} +
Supondo que você tenha alguns arquivos jpg
(com caminhos suficientemente curtos ), o resultado é uma linha por arquivo no primeiro caso e o comportamento padrão ls
de exibir arquivos em colunas para o último.