Qual deles é mais eficiente em um conjunto muito grande de arquivos e deve ser usado?
find . -exec cmd {} +
ou
find . | xargs cmd
(Suponha que não haja personagens engraçados nos nomes dos arquivos)
linux
unix
command-line
find
dogbane
fonte
fonte
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:
ou
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.fonte
exec
produzirá resultados conforme forem encontrados, ondexargs
, 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 quexargs
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.é mais eficiente (ele roda o menor
cmd
número de vezes possível, ao contrárioexec
, 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:
isso vai funcionar mesmo se os nomes de arquivo contêm caracteres funk (
-print0
marcasfind
imprimir partidas NUL-terminadas,-0
marcasxargs
esperam que este formato.)fonte
xargs
abordagem é significativamente mais lenta se não houver (ou apenas alguns) arquivos correspondentes ecmd
não houver muito o que fazer para cada arquivo. Por exemplo, quando executado em um diretório vazio, axargs
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 ...)As
xargs
versões modernas geralmente oferecem suporte à execução de pipeline paralela.Obviamente, pode ser um ponto central quando se trata de escolher entre
find … -exec
e… | xargs
fonte