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


194

Recentemente, configurei uma máquina com o Ubuntu Server para hospedar servidores de jogos. Eu instalei um plug-in de backup para cada servidor de jogo que cria backups freqüentes de arquivos do mundo do jogo em uma pasta específica na máquina. Também estabeleci uma crontarefa para copiar automaticamente esses backups para minha pasta do Dropbox todas as noites usando o rsync com a -aopção

Depois de alguns meses, minha conta do Dropbox atingiu seu limite de armazenamento e eu percebi que não seria capaz de manter tantos backups. Por isso, configurei o plug-in de backup do servidor de jogos para não reter tantos backups e esperei alguns dias para ver se conseguiria. exclua os backups mais antigos, conforme programado semanalmente. O plug-in de backup acabou fazendo 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 do Dropbox para corresponder à pasta de origem, mas não o fez. Então, eu tenho algumas perguntas:

  • Por padrão, rsyncapenas adiciona arquivos à pasta de destino que foram adicionados à pasta de origem e altera os arquivos que foram alterados na pasta de origem, mas NÃO exclui os arquivos que foram excluídos da pasta de origem?

  • Se for esse o caso, qual é a melhor maneira de rsyncfazer 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 rsyncque podem ajudar, mas como não estou familiarizado.

Respostas:


227

Para excluir arquivos no destino, adicione a --deleteopção ao seu comando. Por exemplo:

rsync -avh source/ dest/ --delete

15
Verifique se a fonte é um diretório. Usar source/* dest/não funcionará.
precisa saber é o seguinte

3
Eu encontrei esse evento com --deleteou --delete-afterele não será excluído devido a alguns erros: "Erro de IO encontrado - pulando a exclusão do arquivo". Para resolver este add --ignore-errorsopção e depurar os erros separadamente
MHT

12
Funciona perfeitamente! Mesmo que esteja funcionando, eu recomendaria SEMPRE usar a -n, --dry-runopção antes de executar rsync, especialmente quando se trata de opções como estas ( --delete). Isso evitará qualquer possível dor de cabeça :).
Ivanleoncz

2
@ HTM: Nenhuma resposta parece estar completa sem o seu comentário.
Lonnie Best

2
@TheBicentennialMan -a implica -r .
x-yuri

45

O comando rsync não excluirá nenhum arquivo enquanto você usa algumas de suas opções deletenesse comando. Portanto, se algum arquivo ou pasta tiver sido adicionado à fonte, ele será sincronizado para o destino sem nenhuma exclusão.

Eu sugiro que você use rsyncpara fazer backup de arquivos de origem e 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 foi de mais de 2 meses.

ATUALIZAR

Como acho que as deleteopções são apenas para o TARGET que, 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 é removido do SOURCE.
  2. O rsync inicia a sincronização de arquivos.

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

Significa que:

  1. O rsync inicia a sincronização de arquivos.
  2. rsync exclui o arquivo do TARGET que é removido do SOURCE após a sincronização.

NOTA : o --delete-{before/after}implemento apenas no TARGET.


1
Obrigado pela resposta!! Você está se referindo a uma opção "excluir" para o rsync? Por que não posso simplesmente usar a opção "excluir" para o rsync?
precisa saber é o seguinte

@ user254251, se você usar delete, o comando rsync excluirá imediatamente os arquivos. Mas, neste caso, há mais tempo para erros.
shgnInc

Se entendi direito, você está dizendo que devo separar a tarefa de exclusão da tarefa rsync para evitar erros. Eu tenho uma pergunta, no entanto. A página de manual do rsync lista algumas opções que parecem servir ao propósito de separar a tarefa de exclusão executando-a antes ou depois da tarefa de cópia. Por exemplo, vejo duas opções chamadas --delete-before e --delete-after. O rsync com essas opções teria o mesmo efeito que o método que você descreveu? Li a descrição completa de cada opção na página de manual, mas há algumas informações nas descrições que não entendo.
precisa saber é o seguinte

@ user254251, Resposta atualizada. Não sei se existe uma maneira de excluir arquivos do TARGET por limitação de tempo no rsync .
shgnInc

Obrigado! Então você acha que estou seguro contra erros se eu simplesmente usar a opção --delete-before? Como não estou especificando um tempo limite, não devo me preocupar se o estágio de exclusão do rsync atrasar o estágio de transferência. O rsync é executado uma vez por dia e é bastante tempo para sincronizar os arquivos de backup antes da próxima sincronização, portanto, também não deveria ser necessário limitar o tempo da sincronização.
precisa saber é o seguinte

6

Este comando copiará os dados de incremento e os manterá sincronizados com o servidor remoto.

  1. Ele copiará apenas dados incrementais.
  2. Ele excluirá se houver dados excluídos da fonte.
  3. Ele copiará novamente da fonte se houver algum dado excluído no destino.
  4. basicamente, este comando manterá os dois ambientes sincronizados.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Exemplo:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
Eu acho que -W faz não copiar apenas dados incrementais, mas sempre copiar arquivos inteiros.
Tulains Córdova

Eu recebi esse erro executando este comando: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Se houver algum erro durante uma scync rsync, rsync não vai apagar corretamente os arquivos que ele deve ter, mesmo se você usou --delete, --delete-afterou --delete-before.

É por isso que é importante resolver os erros do 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 estiver sincronizando do Linux para um sistema de arquivos não Linux (como NTFS, FAT), --permsocorrerá erros porque o rsync não pode definir permissões do Linux em um sistema de arquivos Linux. sistemas de arquivos não-linux . Novamente, erros = sem exclusão.

- Ao sincronizar a uma partição não-Linux, eu uso --no-permspara evitar esses erros que sabotagem --delete, --delete-afterou --delete-before.

Se você ainda receber erros depois disso e não conseguir descobrir como fazer com que esses erros ocorram, poderá executar um comando exclusivamente dedicado à exclusão dos 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 fora de sincronia, mas não sincronizará nenhum arquivo. Portanto, você deve sincronizar novamente depois disso. Esse comando é baseado nesta resposta , exceto que eu adicionei o --ignore-errorsargumento também, portanto, ele seria excluído mesmo se houver erros.


1
Obrigado pela dica! Eu sou o autor original desta pergunta há 5 anos. Estou realmente feliz por você ter postado isso, porque eu planejava configurar a sincronização para uma unidade NTFS em um futuro próximo e provavelmente teria encontrado o erro de permissão porque estava planejando usar a opção "-a" para rsync, que sincroniza permissões (entre outras coisas). Então eu adicionei "--no-perms" às minhas anotações. Agora planejo usar o rsync -a --no-perms --delete-before. Tenho uma pergunta: --delete-before não evitaria problemas com a exclusão de arquivos executando a exclusão antes da sincronização? Pensei que esse era o seu propósito.
user254251 6/08

@ user254251 - Não tenho certeza. Eu acho que dependeria de quão cedo realmente "exclui antes". Se de alguma forma encontrar um erro antes do início da exclusão, você ferrou. Meu conselho para você é evitar o NTFS a qualquer momento, a menos que você goste de dores agudas :). NTFS para NTFS funciona bem. NTFS para Linix funciona bem. Evite "sistema de arquivos Linux" para "sistema de arquivos não Linux"; é muito trabalhoso garantir que a exclusão funcione corretamente. Você PODE fazer isso, mas eu decidi que não vale a pena, apenas formatar a unidade de destino como EXT4.
Lonnie Best
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.