Rsync ile iki yönlü senkronizasyon


95

Bir klasörüm var a / ve uzak bir klasörüm A /. Şimdi Makefile'da böyle bir şey çalıştırıyorum:

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

sync-music yaptığımda, önce sunucudan yerele tüm farklılıkları alır, sonra tam tersi, tüm farkları yerelden sunucuya gönderir.

Bu, yalnızca gelecekte yalnızca güncellemeler veya yeni dosyalar varsa çok iyi çalışır. Silinmeler varsa, hiçbir şey yapmaz.

Rsync'de istediğimi gerçekleştirmeye yardımcı olmak için --delete ve --delete-after seçenekleri var ama mesele şu ki, 2 yollu senkronizasyonda çalışmıyor.

Bir senkronizasyondaki sunucu dosyalarını silmek istersem, yerel dosyalar silindiğinde çalışır, ancak herhangi bir nedenle (aşağıda açıklanmıştır) sunucuda olmayan ancak yerel olarak var olan ve silinmiş bazı dosyalarım varsa, Bunları yerel olarak kaldırmak istiyorum ve sunucu kopyasını istemiyorum (olduğu gibi).

Şey, bağlamda 3 makinem var:

  1. masaüstü
  2. not defteri
  3. ev sunucusu

Bu nedenle, bazen, sunucuda bir not defteri senkronizasyonuyla silinen dosyalar olabilir, örneğin masaüstümle bir senkronizasyon çalıştırdığımda (silinen sunucu dosyalarının hala bulunduğu yerde) bu dosyaların silinmesini ve olmamasını istiyorum tekrar sunucuya kopyalandı.

Sanırım bu sadece bir veritabanı ve işlem takibi ile mümkün: P

Daha basit çözümler var mı? Teşekkür ederim.


1
Bende de aynı sorun var. Bir çözüm buldun mu, mwm?
mouche

7
aslında şimdi yaptım. Dropbox benzeri bir deneyim elde etmeye çalışıyordum ve dosya değişikliklerini izlemek için unison (rsync kullanan) ve lsyncd içeren bir çözüm buldum. Ayrıca bu çözüme ve daha fazla püf
noktaya

bugünlerde nextcloud'u ev sunucumda yerel olarak kullanıyorum. mükemmel "dropbox" çözümü% 100 benim tarafımdan yönetiliyor. android / ios / win / macos / linux / web istemcilerine sahiptir.
mwm

Yanıtlar:


63

Unison'u deneyin: http://www.cis.upenn.edu/~bcpierce/unison/

Sözdizimi: unison dirA/ dirB/

Unison, dosyalar farklı olduğunda ne yapılacağını sorar, ancak varsayılan (çakışmayan) seçenekleri kabul eden aşağıdakileri kullanarak işlemi otomatikleştirebilirsiniz:

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ hiç soru sormaz ve kaç dosyanın yok sayıldığını çıktı olarak yazar (çünkü birbirleriyle çelişirler).


7
Küçük dizinler için Unison kullanımı oldukça kolaydır. Ancak, çok sayıda dosya içeren dizinler için son derece YAVAŞ. Rsync'in kopyalamaya neredeyse hemen başlayacağı yerlerde, unison'ın kopyalamaya başlaması bazen 12 saatten fazla sürer, çünkü herhangi bir şeyi kopyalamadan önce her dosyayı tarar.
Brent Faust

1
En azından git kullanımı kolaydır ve aktarımı hızlıdır. Blob için github tarafından geliştirilen Large File Storage adlı bir uzantı vardır .
Wener

1
Git'in ana sorunları büyük dosyalardır ve gerçekten açık taahhütler için tasarlanmış olmasıdır. Her ikisi de git-annex, büyük dosya depolama gibi eklentilerle makul ölçüde iyileştirilebilir
alex

3
@wener Vida için çekiç veya çivi için tornavida kullanmayın. :)
ADTC

3
uyum harika - ama aynı zamanda çok da güvenilmez. Kullanım durumlarımın yaklaşık% 50'sinde basit işe yaramadı. Bunun en yaygın nedeni, sürümler arası yeteneğin zayıf olmasıdır. Bazen ayrıcalığım olmayan bir bilgisayardaki içerikle senkronize ediyorum. Bu sunucu benden farklı bir sürüme sahip olursa, unison başarısız olur. Buna ek olarak, bazı kitaplıkların farklı derlenmiş sürümlerini kullandıkları için (bu, bir ubuntu bilgisayar ile ahududu pi arasındaydı) son zamanlarda aynı sürümün birleşik istemcileri arasında başarısız oldu.
argentum2f


5

Osync'i kullanabilirsiniz: http://www.netpower.fr/osync , akıllı silme yayılımına sahip rsync tabanlı. durdurulmuş bir yürütmeyi sürdürme, yazılımdan silme ve zaman kontrolü gibi birden çok seçeneğe de sahiptir.


5

Asıl soru aynı zamanda bir masaüstü ve dizüstü bilgisayar ve müzik dosyalarını içeren bir örnek içerdiğinden (bu nedenle muhtemelen bir GUI kullanıyor), bugüne kadarki en iyi çift yönlü, çok platformlu, ücretsiz ve açık kaynaklı programlardan birinden de bahsedeceğim: FreeFileSync .

GUI tabanlı, çok hızlı ve sezgisel, filtreleme ve uzaktan bağlanma, "çarpışmaları" görüntüleme ve etkileşimli olarak yönetme (örneğin, benzer zaman damgalarına sahip dosyalar) ve çift yönlü aktarım, yansıtma ve yakında.


4

Bunu dene,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

Bunu sadece test ettim ve benim için çalıştı. Windows7 (yüklü rsync paketi ile cygwin kullanarak) ve FreeNAS dosya sunucusu (FreeNAS, rsync paketi önceden yüklenmiş olarak FreeBSD üzerinde çalışır) arasında 2 yönlü bir senkronizasyon yapıyorum.


3
Bu yeni yerel dosyaları silmez mi? -uhedefte daha yeni olan dosyaları atlar, ancak rsync'in bir silme işleminin yaşını takip etme yolu yoktur, bu nedenle bu komut dosyası, yerel bir dosyanın ne zaman yeni (ve saklanması gereken) veya eski (ve silinmesi gerektiği) arasında nasıl bir ayrım yapabilir? ? Yoksa yanlış mı anlıyorum?
Matthemattics

Mu --delete-excludedherhangi bir hedef dizinleri mevcut olan dosyaları ancak kaynak dizinleri silmek? Tanımlamanız gerektiğini düşündüm, --exclude=<filename>bu yüzden rsync yalnızca bu dışlamaları silmez mi? Yoksa rsync, kaynak olmayan tüm dizin dosyalarını "dışlayanlar" olarak mı ele alır?
Mr_Moneybags

2
Cevabı buldum:
Mr_Moneybags

2
Anladığım kadarıyla, eğer hedefte bir dosya yaratırsam ve sonra kaynaktan hedefe kopyalamak için rsync komutunu çalıştırırsam, hiçbir zaman damgası kullanılmadığı için hedefteki dosyayı silecektir. İstediğin bu değil mi?
elexhobby

10
@ Lübnah: Doğru; Bu çözüm , tam 2 yönlü senkronizasyon değil : rsync ile Çünkü --delete-excludedile çalıştırılan sunucuda olarak kaynağında ilk: dosyaları yerel olarak ilave edilecektir silindi (eklenen dosyalar oysa o çalışması sırasında sunucuya olan yerel hedefe kopyalanan). Sunucuya geri senkronize edilen tek yerel dosyalar , sunucuda bulunan ve yerel olarak değiştirilen (sunucu sürümlerinden daha yakın zamanda) dosyalardır - ki bu, OP'nin senaryosunda olası değildir. Sizin de ima ettiğiniz gibi, gerçek 2 yollu senkronizasyon ile yapılamaz rsync, çünkü çalıştırmalar arasında durum kaydetme gereklidir.
mklement0


1

Şimdi SparkleShare kullanıyorum https://www.sparkleshare.org/

mac, linux ve windows üzerinde çalışır.


Zaman geçtikçe çözümümü güncellemeye devam ediyorum. Şimdi ev sunucumda nextcloud kullanıyorum. linux, mac, windows, android ve ios'ta nextcloud istemcisi ile senkronizasyon.
mwm

0

İki senkronizasyonla çalışıp çalışmadığından emin değilim, ancak --delete'nin çalışması için --recursive parametresini de eklemeniz gerekir.


1
Seçenek kısa bir eşdeğeri --recurseolduğu -rOP olan, bir (basınçlı seçenekler grubuna gömülü kullanılarak -avzru).
mklement0

0

Bir klasörü uzaktan kumandayla senkronize tutmak için cloudync'i kullanabilirsiniz :

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

Uzaktan kumanda NFS ise, şunları kullanabilirsiniz:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs

-1

Rclone , aradığınız şeydir. Rclone ("bulut depolama için rsync"), yerel dosya sistemleri dahil olmak üzere farklı bulut depolama sağlayıcıları ile dosya ve dizinleri senkronize etmek için bir komut satırı programıdır. Rclone daha önce Swiftsync olarak biliniyordu ve 2013'ten beri piyasada.


İki yönlü senkronizasyonu desteklemez: rclone.org/commands/rclone_sync
Martin Braun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.