Respostas:
A diferença de velocidade será insignificante.
Mas você tem que ter certeza de que:
Seu script não assumirá que nenhum arquivo terá espaço, tabulação, etc no nome do arquivo; a primeira versão é segura, a segunda não.
Seu script não tratará um arquivo que comece com " -" como uma opção.
Portanto, seu código deve ser assim:
find . -exec cmd -option1 -option2 -- {} +
ou
find . -print0 | xargs -0 cmd -option1 -option2 --
A primeira versão é mais curta e fácil de escrever, pois você pode ignorar 1, mas a segunda versão é mais portável e segura, já que " -exec cmd {} +" é uma opção relativamente nova no GNU findutils (desde 2005, muitos sistemas em execução ainda não a terão) e estava cheio de erros recentemente . Além disso, muitas pessoas não sabem disso " -exec cmd {} +", como você pode ver nas outras respostas.
execproduzirá resultados conforme forem encontrados, onde xargs, ao que parece, esperará até que todo o diretório seja pesquisado antes de gravar em stdout. Se você está tentando fazer isso em um diretório grande e parece que xargsnão está funcionando, recomenda-se paciência.
-print0find retorna nomes de arquivos separados por nova linha, mas nova linha também pode fazer parte de um nome de arquivo, tornando-o ambíguo. O byte 0 não pode, por isso é um separador seguro. Sim - adicionar --um comando que o suporte é uma boa prática quando você não pode controlar seus argumentos, mesmo que nem sempre seja estritamente necessário ou não seja seguro.
find . | xargs cmd
é mais eficiente (ele roda o menor cmdnúmero de vezes possível, ao contrário exec, que rodacmd uma vez para cada partida). No entanto, você terá problemas se os nomes dos arquivos contiverem espaços ou caracteres estranhos.
O seguinte é sugerido para ser usado:
find . -print0 | xargs -0 cmd
isso vai funcionar mesmo se os nomes de arquivo contêm caracteres funk ( -print0marcas findimprimir partidas NUL-terminadas, -0marcas xargsesperam que este formato.)
xargsabordagem é significativamente mais lenta se não houver (ou apenas alguns) arquivos correspondentes e cmdnão houver muito o que fazer para cada arquivo. Por exemplo, quando executado em um diretório vazio, a xargsversão levará pelo menos o dobro do tempo, pois dois processos devem ser iniciados em vez de apenas um. (Sim, a diferença geralmente é imperceptível em * nix, mas em um loop pode ser importante; ou, tente no Windows em algum momento ...)