RSync: Her iki yönde nasıl senkronize ederim?


85

İki dizini her iki yönde senkronize etmek için rsync kullanmak istiyorum .

Senkronizasyona klasik anlamda atıfta bulunuyorum ( rsync kılavuzlarında kastettiği gibi değil ): Hangisinin daha yeni olduğuna bağlı olarak
dizinleri her iki yönde güncellemek istiyorum .

Bu rsync ile yapılabilir mi (Linux yolu tercih edilir) ?
Değilse, başka hangi çözümler var?


3
Serverfault.com'da daha iyi yanıtlar alacağınıza inanıyorum .
Esteban Küber

Yanıtlar:


78

"Daha yeni" mod (-u veya --update bayrağı) artı -t (dosya değiştirme zamanını kopyalamak için), -r (özyinelemeli klasörler için) ve -v (ne olduğunu görmek için ayrıntılı çıktı için) ile iki kez çalıştırın. yapıyor):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

Bu, silme işlemlerini ele almaz, ancak bu soruna yalnızca periyodik senkronizasyonla iyi bir çözüm olup olmadığından emin değilim.


3
Soru rsync ile ilgili olduğundan, bu yanıtı doğru olarak işaretleyeceğim.
java.is.for.desktop

2
Ama diğer çözümleri de sordunuz ve Unison daha iyi iş çıkarıyor, aksi takdirde başka bir araçtan asla bahsetmezdim. Rsync kullanımını destekleyen belirli koşullarınız olduğunu anlıyorum.
MaD70

1
Sheesh, 6 olumlu oy aldın ve hala şikayet mi ediyorsun? <j / k> Unison gerçekten ilginç bir çözüm ve bundan bahsetmenize sevindim. :)
jsight

2
Şikayet etmiyorum, açıklıyorum. Sadece bir şeyi kaçırmadığımı kontrol etmek için (anadili İngilizce olmamak)
MaD70

1
MaD70 - Sorun değil ... Sadece şaka yapıyordum. :)
jsight

64

Unison File Synchronizer'ı biliyor musunuz ?

Unison, Unix ve Windows için bir dosya senkronizasyon aracıdır. Bir dosya ve dizin koleksiyonunun iki kopyasının farklı ana bilgisayarlarda (veya aynı ana bilgisayardaki farklı disklerde) depolanmasına, ayrı ayrı değiştirilmesine ve ardından her eşlemedeki değişiklikleri diğerine yayarak güncel hale getirilmesine olanak tanır. ...

Ayrıca başarısızlığa dayanıklı olduğunu da unutmayın:

Unison başarısızlığa dayanıklıdır. Anormal sonlandırma veya iletişim arızaları durumunda bile, kopyaları ve kendi özel yapılarını her zaman mantıklı bir durumda bırakmaya özen gösterir.


3
+1. Unison, bunu yapmanın en iyi yoludur. Double-rsync'i doğru yapmak zordur ve silme işlemlerini hiç ele almaz.
Avdi

Evet, Unison hataya dayanıklıdır. Bunu vurgulamak için cevabımı güncelliyorum.
MaD70

6
Unison'ı duymamıştım. Bugün yedek komut dosyalarımı evde yeniden yapmamı sağlamaktan sorumlusunuz.
Esteban Küber

1
Cevabımın bu kadar yararlı olmasına sevindim (bu, sağlam bir teorik temele dayanan bir aracın nasıl pratik olabileceğini gösteriyor).
MaD70

Linuxjournal'da Unison için kısa bir eğitim .
lepe

14

rsyncİki kez çalıştırmanız gerekiyor ve şu şekilde çalıştırmanızı öneririm -au:

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(bir arşiv için) şunun kısayoludur -rlptgoD:

  • -r Alt dizinlere tekrarlayın
  • -l Ayrıca sembolik bağlantıları da senkronize et
  • -p Dosya izinlerini de senkronize et
  • -t Ayrıca dosya değişiklik zamanlarını da senkronize et
  • -g Dosya gruplarını da senkronize et
  • -o Dosya sahibini de senkronize et
  • -D Ayrıca özel (normal / meta değil) dosyaları senkronize edin

Temel olarak, kullanarak aynı bire bir kopya oluşturmak istediğinizde rsync, her zaman kullanmalısınız -a, çünkü çoğu kullanıcı " senkronizasyon " hakkında konuşurken olmasını beklediği şey budur . Buradaki diğer yanıtlar, bazen bir dosyanın içeriğinin değişmeden kaldığını, ancak sahibinin değişmiş olabileceğini veya erişim izinlerinin değişmiş olabileceğini ve bu durumda rsyncölümcül olabilecek dosyayı senkronize etmeyeceğini göz ardı ediyor gibi görünüyor .

Ancak bu, hedefte zaten mevcut olması ve daha yeni bir son değişiklik tarihine sahip olması durumunda, herhangi bir dosyayı / klasörü tamamen bırakmanızı -usöyler rsync. Olmadan -u rsync, bir dosya / klasör daha yeni olsa da olmasa da senkronize olur .

Lütfen bu çözümün silinen dosyaları işleyemeyeceğini unutmayın. Aşağıdaki durum göz önüne alındığında, silme işlemlerinin işlenmesi kolay bir şekilde mümkün değildir: Bir dosya kaynakta silinmiştir, şimdi rsynco dosyanın daha önce var olup olmadığını ve silinip silinmediğini (bu durumda hedefte de silinmesi gerekir) nasıl anlaşılacaktır? kaynakta hiç var olmadı (bu durumda hedeften kopyalanması gerekir). Bu iki durum aynı göründüğünden rsyncnasıl doğru tepki vereceğini bilemez. Aynı duruma yol açabileceğinden, tam tersini senkronize etmenin bir faydası olmayacaktır: Kaynakta bir dosya vardır, ancak hedefte yoktur. Neden? Hedefte hiç var olmadı mı veya silinmiş mi? Her iki durum da aynı görünüyor rsync.

Silinen dosyaları güvenilir bir şekilde senkronize edebilen senkronizasyon araçları, genellikle tüm geçmiş senkronizasyon işlemleriyle ilgili bir senkronizasyon günlüğünü yönetir. Bu günlük bir zamanlar bir dosya olduğunu ve senkronize edildiğini gösteriyorsa ancak şimdi eksikse, silinmiş olduğu açıktır. Günlüğe göre böyle bir dosya hiç olmadıysa, senkronize edilmesi gerekir. Tüm günlük girişlerini zaman damgalarıyla depolayarak, silinen bir dosyanın geri gelip birden çok kez silinmesi bile mümkündür, ancak senkronizasyon aracı her zaman ne yapılacağını bilir ve sonuç her zaman doğrudur. rsyncböyle bir günlüğü yoktur, yalnızca işlemin iki tarafının mevcut dosya durumuna bağlıdır.

Ancak rsync, yukarıda açıklandığı gibi zaten bir senkronizasyon aracına çok yakın olan bir bit POSIX kabuk komut dosyası kullanarak kendinize bir senkronizasyon komutu oluşturabilirsiniz . Ben de böyle bir araca ihtiyacım olduğu için , işte size Stackoverflow'da böyle bir komut dosyası oluştururken rehberlik edecek bir cevap .


Güzelce koydu.
Peter Rowntree

6

Teşekkürler jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

Bu, ikinci senkronizasyonun 1. senkronizasyon bittikten hemen sonra gerçekleşmesine neden olur. Dizin yapısının çok büyük olması durumunda, bilgisayarın önüne oturmaya gerek olmadığı için bu zaman kazandıracaktır. Yapı çok büyükse, ayrıntılı ve ilerlemeyi kaldırın.

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a

1
Dosyanın değiştirilme zamanını kopyalamak için -t eklemeli miyim diye merak ediyorum. -T'yi dışarıda bırakmam için bir neden var mı?
2018

@Chrips Hayır, sanmıyorum. Görünüşe göre bu cevabın amacı &&, 2. komutu otomatik olarak 1. komuttan hemen sonra (1. komut başarılıysa) çalıştırmak için iki komut arasında kullanabileceğinizi göstermek içindir. @ jsight'ın cevabında. Ayrıca, @ jsight'ın cevabının, -tbu cevap gönderildikten sonra seçeneği içerecek şekilde düzenlendiğini düşünüyorum .
Ruben9922

1

Kullanım rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

Örneğin:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

Xxx dosyalarını farklı şeyler / xxx dosyalarıyla senkronize eder. Eğer farklı şeyler / xxx dosyaları yoksa, onu oluşturur - yani kopyalayın.

-pogtEtv - dosya meta verilerini korumak için bir dizi seçenek, artı v - ayrıntılı ve r - özyinelemeli

--progress - senkronizasyonun ilerlemesini gerçek zamanlı olarak gösterin - büyük dosyaları kopyalarsanız çok yararlı

--bwlimit=2000 - maksimum kopyalama / eşitleme hızını ayarlar (bw = bant genişliği)

PS rsync, ağ üzerinden çalışırken çok önemlidir, yerel makine durumunda cp gibi komutları kullanabilirsiniz .

İyi şanslar!


0

Ben kullanıyorum rsyncile inotifywait. Herhangi bir dosyayı değiştirdiğinizde rsyncçalıştırılacaktır.

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

Her inotifywaitiki ana bilgisayarda koşmanız gerekir . Lütfen inotifywait örneğini kontrol edin


0

İhtiyacın olan şey Rclone . Rclone ("bulut depolaması için rsync"), dosyaları ve dizinleri farklı bulut depolama sağlayıcıları (kutu, dropbox, ftp vb.) Ve yerel dosya sistemleriyle senkronize etmek için kullanılan bir komut satırı Linux programıdır. Rlone yalnızca ayna senkronizasyonunu destekler.

Gerçek zamanlı senkronizasyonu içeren başka bir grafik çözüm , RealTimeSync programını içeren FreeFileSync'i kullanmak olacaktır . FreefileSync, silme işlemlerini içeren 2 yönlü çift yönlü senkronizasyonu destekler.

FreFileSync gui


0

Aynı soruyu soruyordum ve sonunda kullanmaya başladım git. Durumunuza uymayabilir, ancak biri bu konuyu bulursa ve aynı soruyu sorarsa, bir sürüm kontrol sistemi düşünebilirsiniz.

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.