Neste rápido post vamos ver como fazer uma busca (find) num diretório com milhares de arquivos a partir de uma data especifica e jogar este resultado (milhares de linhas) num lista txt. Isso tudo para não jogar este valor na memória.

Imagine o seguinte cenário: Temos um diretório de arquivos xml, xls… e desejamos fazer uma busca de arquivos anteriores a 365 dias. Se este find vai retornar uma lista gigante de arquivos algo assim em media 500.000 arquivos. Não podemos fazer somente o find e jogar esta lista na memória.

Temos que executar o find e jogar este resultado em um arquivo txt. conforme o exemplo abaixo:

DATA=365
ORIGEM=clienteA/
DESTINO=/disco/backup/
LOG=/var/log/`date +%Y-%m-%d`_copy_files_s3.log
OPCOES=“–times –relative –recursive –compress –verbose –owner –group”
find $ORIGEM -type f -mtime +$DATA > lista.txt

Com este resultado na mão (lista.txt) nos podemos fazer o rsync, pois este é um recurso pouco usado (–files-from=) onde podemos apontar onde esta nossa lista de SOURCE para o rsync. Conforme o exemplo abaixo:

rsync $OPCOES –files-from=lista.txt . $DESTINO >> $LOG

Sendo o ( . ) usado no comando rsync o local onde esta o arquivo de lista dos arquivos.