Como manter duas pastas sincronizadas automaticamente?

86

Eu gostaria de ter uma cópia sincronizada de uma pasta com todas as suas subárvores.

Deve funcionar automaticamente desta forma: sempre que eu crio, modifico ou apago coisas da pasta original, essas alterações devem ser aplicadas automaticamente à pasta de sincronização.

Qual é a melhor abordagem para essa tarefa?

BTW: estou no Ubuntu 12.04

O objetivo final é ter uma cópia de backup separada em tempo real, sem o uso de links simbólicos ou montagem. Eu usei o Ubuntu One para sincronizar dados entre meus computadores e, depois de um tempo, algo deu errado e todos os meus dados foram perdidos durante a sincronização.

Então, pensei em adicionar mais uma etapa para manter uma cópia de backup dos meus dados:

  • Eu mantenho meus dados armazenados em uma "pasta A"
  • Preciso da resposta à minha pergunta atual para criar uma sincronização unilateral da "pasta A" para a "pasta B" ( cronum script com rsync? Poderia ser?). Preciso que seja unilateral de A para B, quaisquer alterações em B não devem ser aplicadas a A.
  • O que eu simplesmente mantenho sincronizado a "pasta B" com o Ubuntu One,

    desta forma qualquer mudança em A será aplicada a B, que será detectada do U1 e sincronizada com a nuvem. Se algo der errado e o U1 excluir meus dados em B, sempre os tenho em A.

Inspirado pelos comentários de lanzz, outra ideia poderia ser executar o rsync na inicialização para fazer backup do conteúdo de uma pasta no Ubuntu One, e iniciar o Ubuntu One somente depois que o rsync for concluído.

O que você acha disso? Como saber quando termina o rsync?

Luca Borrione
fonte
O que você está tentando realizar? As pastas realmente precisam ser separadas, você não pode fazer um link simbólico de um nome para o outro ou ligar-montar o diretório para o local secundário? Além disso, dê uma olhada nestes resultados da pesquisa .
lanzz,
1
Eu aconselho contra sincronização real ao vivo (ou seja, observando continuamente por alterações de arquivos no diretório de origem) em favor do periódico rsyncvia cron.
lanzz,

Respostas:

99

Você pode usar inotifywait(com os modify,create,delete,movesinalizadores habilitados) e rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Se você não tem inotifywaitem seu sistema, executesudo apt-get install inotify-tools

silgon
fonte
3
Você pode querer considerar adicionar -e ssh user@remote:/targeta rsyncse você quiser usar o SSH como o transporte para aceder ao seu computador remoto.
Falcon
2
Obrigado @Falcon, costumo usar rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. No entanto, queria escrever uma resposta simples.
silgon
4
para esclarecer: isso é executado uma única vez, ou você adicionaria isso a um bashrc ou algo assim?
Brad Johnson
1
Você pode considerar todo o loop while como um processo que sincroniza quando necessário. Normalmente adiciono ao Makefile do projeto em que estou trabalhando. Desta forma, posso escolher o servidor e o diretório onde quero que seja salvo. Um dos meus casos de uso é quando eu programo algoritmos de aprendizado profundo em meu laptop e o sincronizo para realizar o processo pesado em um computador dedicado com CPU e GPU melhores. Também excluo arquivos de que não preciso, como a .gitpasta.
silgon
2
Isso não lida com renomeações de arquivos, usemodify,create,delete,move
urusha
24

Você precisa de algo assim: https://github.com/axkibe/lsyncd É uma ferramenta que combina rsync e inotify - o primeiro é uma ferramenta que espelha, com as opções corretas definidas, um diretório para o último bit. O último diz ao kernel para notificar um programa sobre mudanças em um diretório ou arquivo. Diz:

Ele agrega e combina eventos por alguns segundos e, em seguida, gera um (ou mais) processo (s) para sincronizar as alterações.

Mas - de acordo com a Digital Ocean em https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - deveria estar em o repositório Ubuntu!

Tenho requisitos semelhantes e esta ferramenta, que ainda não experimentei, parece adequada para a tarefa.

Martin
fonte
1
lsyncd a princípio parecia uma bala de prata, mas tem muitos problemas em aberto e, aparentemente, a implementação do macOS é "velha e desatualizada". Não consegui fazer funcionar no dia 10/12.
um nerd pago de
@apaidnerd Para ser justo, são 90 questões abertas vs 420 fechadas. Porém, apenas 10/40 edições foram fechadas no ano passado.
Mateen Ulhaq
8

Apenas uma modificação simples da resposta @silgon:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(a versão @silgon às vezes trava no Ubuntu 16 se você executá-lo no cron)

Denis Kuzin
fonte
2
Por que você executaria no cron?
saygley
@saygley Para uma tarefa específica, após a reinicialização do Ubuntu, o processo de sincronização deve ser executado automaticamente
Denis Kuzin
5
Entendo .. No entanto, já que isso normalmente deve ser iniciado uma vez e estar rodando enquanto o servidor estiver ativo; Eu consideraria algo embutido dentro de rc.local.
saygley
2

Você pode aproveitar as vantagens do fschange . É uma notificação de alteração do sistema de arquivos Linux. O código-fonte pode ser baixado do link acima, você pode compilá-lo sozinho. fschangepode ser usado para controlar as alterações do arquivo lendo os dados de um arquivo proc (/ proc / fschange). Quando os dados são gravados em um arquivo, fschange relata o intervalo exato que foi modificado em vez de apenas dizer que o arquivo foi alterado. Se você está procurando uma solução mais avançada, sugiro verificar o Resilio Connect . É multiplataforma e oferece opções estendidas de uso e monitoramento. Por ser baseado em BitTorrent, é mais rápido do que qualquer outra ferramenta de sincronização existente. Foi escrito em seu nome.


fonte
0

Eu uso este programa gratuito para sincronizar arquivos e diretórios locais: https://github.com/Fitus/Zaloha.sh . O repositório também contém uma demonstração simples.

O bom ponto: é um script bash shell (um arquivo apenas). Não é uma caixa preta como outros programas. A documentação também está lá. Além disso, com alguns talentos técnicos, você pode "dobrar" e "integrá-lo" para criar a solução final que desejar.

Petas
fonte