Se você pode confiar nos registros de data e hora da última modificação do sistema de arquivos, pode acelerar o processo combinando o Rsync com o utilitário 'localizar' do UNIX / Linux. 'find' pode montar uma lista de todos os arquivos que mostram horários da última modificação no dia anterior, e então canalizar SOMENTE a lista abreviada de arquivos / diretórios para o Rsync. Isso é muito mais rápido do que fazer com que o Rsync compare os metadados de todos os arquivos do remetente com o servidor remoto.
Em suma, o comando a seguir executará Rsync SOMENTE na lista de arquivos e diretórios que foram alterados nas últimas 24 horas: (O Rsync NÃO se incomodará em verificar quaisquer outros arquivos / diretórios.)
find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
Caso você não esteja familiarizado com o comando 'find', ele recursiva através de uma subárvore específica do diretório, procurando arquivos e / ou diretórios que atendam aos critérios especificados. Por exemplo, este comando:
find . -name '\.svn' -type d -ctime -0 -print
iniciará no diretório atual (".") e passará por todos os subdiretórios, procurando:
- qualquer diretório ("-type d"),
- com o nome ".svn" ("-name '.svn'"),
- com metadados modificados nas últimas 24 horas ("-ctime -0").
Imprime o nome do caminho completo ("-print") de qualquer coisa que corresponda a esses critérios na saída padrão. As opções '-name', '-type' e '-ctime' são chamadas de "testes", e a opção '-print' é chamada de "ação". A página man do 'find' tem uma lista completa de testes e ações.
Se você quiser ser realmente inteligente, pode usar o teste '-cnewer' do comando 'find', em vez de '-ctime' para tornar esse processo mais tolerante a falhas e flexível. '-cnewer' testa se cada arquivo / diretório na árvore teve seus metadados modificados mais recentemente do que algum arquivo de referência. Use 'touch' para criar o arquivo de referência da corrida NEXT no início de cada corrida, antes do 'find ... | O comando rsync ... 'é executado. Aqui está a implementação básica:
#!/bin/sh
curr_ref_file='ls /var/run/last_rsync_run.*'
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file
Esse script sabe automaticamente quando foi executado pela última vez e transfere apenas arquivos modificados desde a última execução. Embora isso seja mais complicado, ele protege você contra situações em que você pode ter perdido a execução do trabalho por mais de 24 horas, devido ao tempo de inatividade ou a algum outro erro.