Esse comando de localizar e copiar pode ser feito mais rápido?

1

Atualmente, estou usando o seguinte comando para copiar um subconjunto dos arquivos de registro de um colega de trabalho para outro local para meus próprios registros e análise posterior.

find . -name '*somestring*' -type f -exec cp -v --update -i {} '//anetworkdrive/logfiles/'  \;

Com o tempo, à medida que o número de arquivos em cada local aumenta, isso está ficando mais lento (obviamente), mas parece estar diminuindo mais do que o esperado.

Se eu executar time find . -name '*somestring*' -type f nas pastas de origem e de destino, ele encontrará < 1.000 arquivos em cada local e isso leva cerca de 0.2s (real).

Em um cenário em que nada mudou em nenhuma das extremidades desde a última execução, eu teria pensado que o comando de cópia acima não levaria muito mais tempo do que a descoberta sozinha. O find retorna uma lista de arquivos em < 1s, e achei que cp --update verificaria a data modificada em ambos os arquivos (src, dest) muito rapidamente e pularia se eles combinassem.

No entanto, meu comando de cópia completa está demorando quase um minuto, fazendo a pergunta se ele está fazendo uma comparação mais detalhada do que apenas uma data de modificação, por exemplo, uma diff completa ou algo assim.

Alguém pode me explicar por que o comando acima demora tanto quando nada mudou?

E há uma maneira mais rápida de fazer isso? Seria mais rápido canalizar os resultados de busca para o cp?

Obrigado.

    
por SSilk 14.03.2018 / 18:50

1 resposta

1

OK, então, com base no comentário de Daniel B acima, eu testei três métodos.

Eu testei estes em uma unidade local para transferência de unidade local em que find . -name '*somestring*' encontrou 495 arquivos, com média de 5.8MB e totalizando 2.82GB. O primeiro resultado de tempo para cada método é com o diretório de destino vazio para que todos os 495 arquivos sejam copiados. O segundo resultado de sincronismo é com o destino já correspondendo à fonte, para que nenhum arquivo seja copiado.

1 - Usando exec no comando find:

time find . -name '*somestring*' -type f -exec cp -v --update -i {} -t '../dst/'  \;
real    2m2.037s
real    0m35.043s

2 - Lista de tubulação de arquivos diretamente para o cp:

time find . -name '*somestring*' -type f -print0 | xargs -0 cp -v --update -t '../dst/'
real    1m42.354s
real    0m3.463s

3 - Usando rsync

time rsync -vh --update *somestring* '../dst/'
real    1m53.605s
real    0m2.300s

Então, nessa situação, rsync basicamente empatou com cp . No entanto, quando voltei ao meu aplicativo real de cópia de um local de rede para outro, descobri que rsync assumiu a liderança. No meu cenário real, o piping find to cp demorou cerca de 15 segundos quando o diretório dst já correspondia a src, enquanto rsync demorou cerca de 7 segundos.

Então rsync é!

    
por 14.03.2018 / 20:45