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.
: