Como faço para o rsync excluir arquivos que foram excluídos da pasta de origem?

Como faço para o rsync excluir arquivos que foram excluídos da pasta de origem?

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 crontarefa para copiar automaticamente esses backups para minha pasta Dropbox todas as noites usando rsync com a -aopçã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 rsynctarefa 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 rsyncapenasadicionararquivos 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 rsyncisso? 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 rsyncque podem resolver o problema, mas como não estou familiarizado.

Responder1

Para excluir arquivos no destino, adicione a --deleteopçã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 deletenesse 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 rsyncpara fazer backup dos arquivos de origem e usar find ... rmpara 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 deleteopções são apenas para o TARGET, se alguns arquivos forem removidos da fonte, rsync --deleteremova-os do TARGET. E a deleteopção by aftere before, conforme mencionado em sua página de manual:

--delete-before         receiver deletes before transfer, not during

Significa que:

  1. rsync exclui o arquivo do TARGET que foi removido do SOURCE.
  2. rsync inicia a sincronização de arquivos.
--delete-after          receiver deletes after transfer, not during

Significa que:

  1. rsync inicia a sincronização de arquivos.
  2. 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

  1. arquivosadicionadoemlocalsão adicionados acontrolo remoto
  2. arquivosremovidodelocalsão removidos decontrolo remoto
  3. arquivosadicionadoemcontrolo remotoestão removidos
  4. arquivosremovidodecontrolo remotosão restaurados delocalse existirem, caso contrário, serão ignorados

Os parâmetros explicados:

  • -amodo de arquivo
  • -vaumentar a verbosidade
  • -hnúmeros de saída em um formato legível por humanos
  • -nsimulaçã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 --permsopção durante a sincronização com um sistema de arquivos não Linux. Quando substituí --permspor --no-perms, esses erros desapareceram e a exclusão funcionou.

--permsestá 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), --permscausa 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-permspara 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-errorsargumento também, para que ele fosse excluído mesmo se houvesse erros.

informação relacionada