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.
exec
produzirá 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 xargs
não está funcionando, recomenda-se paciência.
-print0
find 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 cmd
nú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 ( -print0
marcas find
imprimir partidas NUL-terminadas, -0
marcas xargs
esperam que este formato.)
xargs
abordagem é significativamente mais lenta se não houver (ou apenas alguns) arquivos correspondentes e cmd
não houver muito o que fazer para cada arquivo. Por exemplo, quando executado em um diretório vazio, a xargs
versã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 ...)