linux: é a árvore -i -f -L $ depth supostamente mais rápida do que encontrar -maxdepth $ depth?

5

Estou consultando diretórios específicos para ver se encontro arquivos com um padrão específico neles e tenho tentado com dois comandos diferentes:

Comando padrão find :

find -L $unix_dir\*/ -maxdepth $maxdepth -name \"$filepattern\"

e uma substituição do comando tree e grep :

tree -L $maxdepth -l -i -f $unix_dir*/ | grep '$filepattern'

O segundo é supostamente mais rápido por algum motivo? Eu acho que às vezes é mais rápido, mas às vezes tão rápido quanto o outro comando, e eu não tenho certeza qual é a teoria por trás de ambos. Alguma idéia?

    
por 719016 12.04.2013 / 10:49

2 respostas

1

Eu diria que o segundo é mais lento, pois envolve dois processos tree e grep , enquanto o primeiro tem apenas um processo find .

Além disso, tree grava os nomes de todos os arquivos que encontra em seu fluxo de saída, que são consumidos por grep . Ao mesmo tempo, find imprime apenas os nomes dos arquivos correspondentes.

Ao usar find , ele tenta corresponder somente o nome do arquivo ao $filepattern especificado. No segundo caso, o padrão é aplicado ao caminho completo do arquivo. Assim, o segundo caso tem mais dados para processar.


Por outro lado, o gargalo neste teste é disco IO. Ambos find e tree atravessam os diretórios.
Se você executar cada teste um após o outro, o sistema operacional armazenará em cache os dados sobre os diretórios e nomes de arquivos, portanto, o comando será concluído mais rapidamente.

    
por 22.04.2013 / 22:27
0

O comando find escreve mais caracteres na tela porque grava sempre o caminho completo para o arquivo. Além disso, a comparação com um filtro de linha pode ser mais longa no comando de localização (depende da implementação). Por exemplo, com pseudocódigo:

  • encontre

    • Extrair nome do arquivo
    • Comparar nome do arquivo com filepattern
  • árvore

    • Comparar nome do arquivo com filepattern
por 16.04.2013 / 15:09