Eu tenho uma pasta a / e uma pasta remota A /. Agora eu executo algo assim em um Makefile:
get-music:
rsync -avzru server:/media/10001/music/ /media/Incoming/music/
put-music:
rsync -avzru /media/Incoming/music/ server:/media/10001/music/
sync-music: get-music put-music
quando eu faço sync-music, ele primeiro pega todos os diffs do servidor para o local e depois o oposto, enviando todos os diffs do local para o servidor.
Isso funciona muito bem apenas se houver apenas atualizações ou novos arquivos no futuro. Se houver exclusões, ele não fará nada.
No rsync, existem as opções --delete e --delete-after para ajudar a realizar o que eu quero, mas o fato é que não funciona em uma sincronização bidirecional.
Se eu quiser excluir arquivos do servidor em um syn, quando os arquivos locais foram excluídos, funciona, mas se, por algum motivo (explicado a seguir) eu tiver alguns arquivos que não estão no servidor, mas existem localmente e foram excluídos, Eu quero removê-los localmente e não copiados pelo servidor (como acontece).
O fato é que tenho 3 máquinas em contexto:
- Área de Trabalho
- caderno
- servidor doméstico
Então, às vezes, o servidor terá arquivos que foram excluídos com uma sincronização de notebook, por exemplo, e então, quando eu executar uma sincronização com meu desktop (onde os arquivos do servidor excluídos ainda existem), quero que esses arquivos sejam excluídos e não sejam copiado novamente para o servidor.
Acho que isso só é possível com um banco de dados e controle de operações: P
Alguma solução mais simples? Obrigado.
Respostas:
Experimente o Unison: http://www.cis.upenn.edu/~bcpierce/unison/
Sintaxe:
unison dirA/ dirB/
O Unison pergunta o que fazer quando os arquivos são diferentes, mas você pode automatizar o processo usando o seguinte, que aceita opções padrão (não conflitantes):
unison -auto dirA/ dirB/
unison -batch dirA/ dirB/
não faz nenhuma pergunta e grava na saída quantos arquivos foram ignorados (porque houve conflito).fonte
:)
Você também pode tentar bitpocket: https://github.com/sickill/bitpocket
fonte
Você pode usar o Osync: http://www.netpower.fr/osync , que é baseado em rsync com propagação de exclusão inteligente. ele também tem várias opções, como retomar uma execução interrompida, exclusão suave e controle de tempo.
fonte
Uma vez que a pergunta original também envolve um desktop e laptop e exemplos envolvendo arquivos de música (portanto, ele provavelmente está usando uma GUI), eu também mencionaria um dos melhores programas bidirecionais, multiplataformas, gratuitos e de código aberto até hoje: FreeFileSync .
É baseado em GUI, muito rápido e intuitivo, vem com filtragem e muitas outras opções, incluindo a capacidade de conexão remota, para visualizar e gerenciar interativamente "colisões" (por exemplo, arquivos com timestamps semelhantes) e para alternar entre transferência bidirecional, espelhamento e em breve.
fonte
Tente isto,
Acabei de testar isso e funcionou para mim. Estou fazendo uma sincronização bidirecional entre o Windows7 (usando cygwin com o pacote rsync instalado) e o servidor de arquivos FreeNAS (o FreeNAS é executado no FreeBSD com o pacote rsync pré-instalado).
fonte
-u
ignora os arquivos mais recentes no destino, mas o rsync não tem uma maneira de rastrear a idade de uma exclusão, então como esse script poderia diferenciar entre quando um arquivo local é novo (e deve ser mantido) ou antigo (e deve ser excluído) ? Ou estou entendendo mal?--delete-excluded
algum arquivo existente nos diretórios de destino, mas não nos diretórios de origem? Achei que você tivesse que definir,--exclude=<filename>
então o rsync não vai deletar apenas essas exclusões? Ou o rsync trata todos os arquivos de diretório não-fonte como "exclui"?--delete-excluded
é executado com o servidor como a fonte primeiro: os arquivos adicionados localmente serão excluídos durante a execução (enquanto os arquivos adicionados ao servidor são copiados para o destino local). Os únicos arquivos locais sincronizados de volta com o servidor são arquivos que também existem no servidor e foram modificados localmente (mais recentemente do que as versões do servidor) - o que não é provável no cenário do OP. Como você sugere, parece-me que a sincronização bidirecional verdadeira não pode ser feita comrsync
, porque é necessário salvar o estado entre as execuções.Você pode tentar o csync , é o mecanismo de sincronização sob o capô do owncloud .
fonte
Agora estou usando SparkleShare https://www.sparkleshare.org/
funciona em mac, linux e windows.
fonte
Não tenho certeza se funciona com sincronização de dois, mas para o --delete funcionar, você também precisa adicionar o parâmetro --recursive.
fonte
--recurse
é o-r
que o OP está usando (incorporado no grupo de opções compactadas-avzru
).Você pode usar o cloudsync para manter uma pasta sincronizada com um controle remoto:
Se o remoto for NFS, você pode usar:
fonte
Rclone é o que você está procurando. Rclone ("rsync para armazenamento em nuvem") é um programa de linha de comando para sincronizar arquivos e diretórios de e para diferentes provedores de armazenamento em nuvem, incluindo sistemas de arquivos locais. Rclone era conhecido anteriormente como Swiftsync e está disponível desde 2013.
fonte