
Recentemente configurei uma máquina com Ubuntu Server para hospedar servidores de jogos. Instalei um plugin de backup para cada servidor de jogo que cria backups frequentes dos arquivos do mundo do jogo em uma pasta específica da máquina. Também estabeleci uma cron
tarefa para copiar automaticamente esses backups para minha pasta Dropbox todas as noites usando rsync com a -a
opção.
Depois de alguns meses minha conta do Dropbox atingiu seu limite de armazenamento e percebi que não conseguiria manter tantos backups, então configurei o plugin de backup do servidor de jogos para não reter tantos backups, depois esperei alguns dias para ver se funcionaria. exclua os backups mais antigos, conforme programado semanalmente. O plug-in de backup finalmente fez seu trabalho e excluiu os backups mais antigos, então eu esperava que a rsync
tarefa cron excluísse posteriormente os backups mais antigos da minha pasta Dropbox para corresponder à pasta de origem, mas isso não aconteceu. Então, eu tenho algumas perguntas:
Por padrão, faz
rsync
apenasadicionararquivos para a pasta de destino que foram adicionados à pasta de origem emudararquivos que foram alterados na pasta de origem, masNÃO excluirarquivos que foram excluídos da pasta de origem?Se for esse o caso, qual é a melhor maneira de fazer
rsync
isso? Quero que a pasta de destino reflita perfeitamente a pasta de origem, e isso significa excluir todos os arquivos que foram excluídos da pasta de origem.
Vejo algumas opções listadas na página de manual rsync
que podem resolver o problema, mas como não estou familiarizado.
Responder1
Para excluir arquivos no destino, adicione a --delete
opção ao seu comando. Por exemplo:
rsync -avh source/ dest/ --delete
Obs: -avh
é para--archive --verbose --human-readable
Responder2
Osincronizar novamenteO comando não excluirá nenhum arquivo enquanto você usa algumas de suas opções delete
nesse comando. Portanto, se algum arquivo ou pasta for adicionado na origem, ele será sincronizado com o destino sem qualquer exclusão.
Eu sugiro que você use rsync
para fazer backup dos arquivos de origem e usar find ... rm
para excluir arquivos por período de tempo ou tamanho dos arquivos:
rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
O bloco de código acima, faça um backup da fonte e exclua todos os arquivos cuja última modificação tenha sido superior a 2 meses.
ATUALIZAR
Como acho que as delete
opções são apenas para o TARGET, se alguns arquivos forem removidos da fonte, rsync --delete
remova-os do TARGET. E a delete
opção by after
e before
, conforme mencionado em sua página de manual:
--delete-before receiver deletes before transfer, not during
Significa que:
- rsync exclui o arquivo do TARGET que foi removido do SOURCE.
- rsync inicia a sincronização de arquivos.
--delete-after receiver deletes after transfer, not during
Significa que:
- rsync inicia a sincronização de arquivos.
- rsync exclui o arquivo do TARGET que foi removido do SOURCE após a sincronização.
OBSERVAÇÃO: O --delete-{before/after}
implemento apenas no TARGET.
Responder3
O comando
$ rsync -avhn --delete local/ remote/
tem o cuidado de sempre sincronizar as alterações feitas localmente com o controle remoto. Isso significa que é preciso ter cuidado para sincronizarlocalecontrolo remotode tal modo que
- arquivosadicionadoemlocalsão adicionados acontrolo remoto
- arquivosremovidodelocalsão removidos decontrolo remoto
- arquivosadicionadoemcontrolo remotoestão removidos
- arquivosremovidodecontrolo remotosão restaurados delocalse existirem, caso contrário, serão ignorados
Os parâmetros explicados:
-a
modo de arquivo-v
aumentar a verbosidade-h
números de saída em um formato legível por humanos-n
simulação, execute um teste sem alterações.Sempre use este sinalizador inicialmente para evitar perda de dados. Quando estiver feliz, remova-o.
Deixe os resultados falarem por si:
Crie 2 diretórios
$ mkdir local/ remote/
Crie arquivos neles
$ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
Veja o que foi criado (antes do rsync):
$ ls local/ remote/ local/: exists_locally_and_remotely local_only remote/: exists_locally_and_remotely remote_only
chamando rsync:
$ rsync -avh --delete local/ remote/ sending incremental file list deleting remote_only local_only sent 160 bytes received 50 bytes 420.00 bytes/sec total size is 0 speedup is 0.00
Veja o resultado (depois do rsync):
$ ls local/ remote/ local/: exists_locally_and_remotely local_only remote/: exists_locally_and_remotely local_only
Como você pode ver, o arquivoremoto/remoto_somentefoiexcluído, o arquivolocal/local_onlyfoisincronizado.
Responder4
Se houver algum erro durante um scync rsync, o rsync não excluirá corretamente os arquivos que deveria ter, mesmo se você usou --delete
, --delete-after
, ou --delete-before
.
É por isso que é importante resolver erros de rsync.
A maioria dos meus erros ocorreu devido ao uso da --perms
opção durante a sincronização com um sistema de arquivos não Linux. Quando substituí --perms
por --no-perms
, esses erros desapareceram e a exclusão funcionou.
--perms
está ok quando você está sincronizando de um sistema de arquivos Linux para outro sistema de arquivos Linux, mas se você estiver sincronizando do Linux para um sistema de arquivos não-Linux (como NTFS, FAT), --perms
causa erros porquersync não pode definir permissões do Linux em sistemas de arquivos não-linux. Novamente, erros = sem exclusão.
- Ao sincronizar com uma partição não-Linux, uso --no-perms
para evitar erros que sabotam --delete
, --delete-after
, ou --delete-before
.
Se você ainda receber erros depois disso e não conseguir descobrir como resolver esses erros, poderá executar um comando dedicado exclusivamente à exclusão de arquivos fora de sincronia:
sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination
O comando acima excluirá itens que estão fora de sincronia, mas não sincronizará nenhum arquivo. Então, você deve sincronizar novamente depois disso. Esse comando é baseado nesteresponder, exceto que eu adicionei o --ignore-errors
argumento também, para que ele fosse excluído mesmo se houvesse erros.