Optimize / substitua o comando 'find'

1

Estou procurando otimizar esse comando de localização. Temos que mover um monte (às vezes quase um milhão) de arquivos para um diretório para processamento adicional. Estamos procurando uma maneira de aumentar a velocidade desse comando, pois pode levar horas para ser executado com uma grande quantidade de arquivos. O problema é que precisamos que os arquivos tenham pelo menos 1 minuto de vida antes de movê-los, já que não queremos mover os que ainda poderiam estar sendo gravados.

find path -name *.cdr.xml -mmin +1 -exec mv {} /path

Edit: Este comando está sendo executado como parte de um script python e precisamos esperar que todos os arquivos sejam encontrados e movidos antes de continuar com o script python.

Todos os nomes de arquivos são do UUID.

    
por Jared Mackey 29.08.2015 / 00:14

2 respostas

1

Uma melhoria de desempenho pode ser obtida usando + terminando com a ação -exec de find , o que fará com que -exec seja bifurcado apenas uma vez.

Enquanto no caso de ; , o -exec será bifurcado a cada vez para um novo argumento.

Então você pode usar:

find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -t /path {} +

Se houver uma chance de nomes de arquivos duplicados:

find path -type f -name '*.cdr.xml' -mmin +1 -exec mv -it /path {} +

Ou

find path -type f -name '*.cdr.xml' -mmin +1 -exec mv --backup=numbered -t /path {} +

--backup=numbered de mv resultará em um backup numerado de arquivos em vez de sobrescrever no caso de nomes de arquivo iguais no destino.

    
por 29.08.2015 / 00:29
0

Você pode dar uma olhada no Watchdog ( link ) para manter toda a sua lógica em python, você pode assistir ao diretório e mova cada arquivo após um minuto sem modificação.

A outra solução é usar rsync para transferir todos os arquivos da saída find em vez de construir com -exec .

Uma pequena explicação:

find ... -exec ... \; - > Isto irá executar o comando para cada resultado, isto adiciona muita sobrecarga e é muito lento.

find ... -exec ... + - > Isso irá concatenar todos os resultados e executar o comando apenas uma vez, isso é muito rápido, mas você pode atingir o limite de caracteres do shell para um comando (especialmente com milhões de arquivos).

Agora com rsync :

find path -name *.cdr.xml -mmin +1 -print0 | rsync --remove-source-files -0 --files-from=- ${DESTINATION}

Explicado:

find ... -print0 | - > Isso passará todos os resultados NULL separados para o pipe a ser processado pelo rsync do outro lado.

--remove-source-files - > Isso é auto-explicativo, assim como mv .

--files-from=- - > Isto irá ler stdin do tubo

-0 - > Isso lerá a lista terminada NULL em vez das linhas do pipe.

Por que NULL? ... Para acelerar um pouco, o NULL usa menos bytes que uma nova linha, leva isso para um milhão e você economiza um monte de bytes.

    
por 29.08.2015 / 01:16