Sinkronisasi dua arah dengan rsync

95

Saya memiliki folder a / dan folder jarak jauh A /. Sekarang saya menjalankan sesuatu seperti ini di 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

ketika saya membuat musik sinkronisasi, pertama-tama ia mendapatkan semua perbedaan dari server ke lokal dan kemudian sebaliknya, mengirim semua perbedaan dari lokal ke server.

Ini bekerja dengan sangat baik hanya jika hanya ada pembaruan atau file baru di masa mendatang. Jika ada penghapusan, tidak melakukan apa-apa.

Di rsync ada opsi --delete dan --delete-after untuk membantu mencapai apa yang saya inginkan tetapi masalahnya, ini tidak berfungsi pada sinkronisasi 2-arah.

Jika saya ingin menghapus file server pada syn, ketika file lokal telah dihapus, itu berfungsi, tetapi jika, karena alasan tertentu (dijelaskan setelah) saya memiliki beberapa file yang tidak ada di server tetapi ada secara lokal dan dihapus, Saya ingin menghapusnya secara lokal dan tidak disalin ke server (seperti yang terjadi).

Masalahnya saya memiliki 3 mesin dalam konteks:

  1. Desktop
  2. buku catatan
  3. server rumah

Jadi, terkadang, server akan memiliki file yang dihapus dengan sinkronisasi notebook, misalnya dan kemudian, ketika saya menjalankan sinkronisasi dengan desktop saya (di mana file server yang dihapus masih ada), saya ingin file ini dihapus dan tidak digunakan. disalin lagi ke server.

Saya kira ini hanya mungkin dengan database dan jalur operasi: P

Ada solusi yang lebih sederhana? Terima kasih.

mwm
sumber
1
Saya memiliki masalah yang sama. Apakah Anda menemukan solusinya, mwm?
mouche
7
saya benar-benar melakukannya sekarang. Saya mencoba untuk mencapai pengalaman seperti dropbox dan datang dengan solusi yang melibatkan serempak (yang menggunakan rsync) dan lsyncd untuk memantau perubahan file. saya juga menemukan orang lain dengan solusi ini dan lebih banyak trik di atas » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm
saat ini saya menggunakan nextcloud secara lokal di server rumah saya. solusi "dropbox" sempurna 100% dikelola oleh saya. memiliki klien android / ios / win / macos / linux / web.
mwm

Jawaban:

63

Coba Serempak: http://www.cis.upenn.edu/~bcpierce/unison/

Sintaksis: unison dirA/ dirB/

Serentak menanyakan apa yang harus dilakukan jika file berbeda, tetapi Anda dapat mengotomatiskan proses dengan menggunakan berikut ini yang menerima opsi default (tidak berkonflik):

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ tidak mengajukan pertanyaan sama sekali, dan menulis ke keluaran berapa banyak file yang diabaikan (karena bentrok).

alex
sumber
7
Serempak cukup mudah digunakan untuk direktori kecil. Tetapi sangat LAMBAT untuk direktori dengan banyak file. Di mana rsync akan mulai menyalin hampir seketika, kadang-kadang membutuhkan waktu lebih dari 12 jam untuk mulai menyalin, karena ia memindai setiap file sebelum menyalin apa pun.
Brent Faust
1
Ini bagus dalam hal ini? Setidaknya git mudah digunakan dan pengirimannya cepat. Untuk blob ada ekstensi yang dikembangkan oleh github bernama Large File Storage .
mulai
1
Masalah utama git adalah file besar dan itu benar-benar dirancang untuk komit eksplisit. Keduanya dapat ditingkatkan secara wajar dengan add-on seperti git-annex, penyimpanan file besar, dll.
alex
3
@wener Jangan gunakan palu untuk sekrup, atau obeng untuk paku. :)
ADTC
2
serempak itu bagus - tapi juga sangat tidak bisa diandalkan. Pada sekitar 50% kasus penggunaan saya, cara sederhana ini tidak berhasil. Penyebab paling umum dari ini adalah kemampuan antar versi yang buruk. Saya terkadang menyinkronkan dengan konten di komputer yang tidak memiliki hak istimewa. Jika server itu kebetulan memiliki versi yang berbeda dari yang saya miliki, serentak gagal. Selain itu, saya baru-baru ini mengalami kegagalan di antara klien serentak dari versi yang sama, karena mereka menggunakan versi kompilasi yang berbeda dari beberapa pustaka (ini antara komputer ubuntu dan raspberry pi).
argentum2f
5

Anda dapat menggunakan Osync: http://www.netpower.fr/osync , yang berbasis rsync dengan propagasi penghapusan cerdas. itu juga memiliki beberapa opsi seperti melanjutkan eksekusi yang dihentikan, penghapusan lunak, dan kontrol waktu.

Orsiris de Jong
sumber
5

Karena pertanyaan asli juga melibatkan desktop dan laptop dan contoh yang melibatkan file musik (maka dia mungkin menggunakan GUI), saya juga akan menyebutkan salah satu program bi-directional, multi-platform, gratis dan open source terbaik sampai saat ini: FreeFileSync .

Berbasis GUI, sangat cepat dan intuitif, hadir dengan pemfilteran dan banyak opsi lainnya, termasuk kemampuan untuk menghubungkan jarak jauh, untuk melihat dan secara interaktif mengelola "tabrakan" (misalnya, file dengan cap waktu serupa) dan untuk beralih antara transfer dua arah, pencerminan dan begitu seterusnya.

Dario Fumagalli
sumber
4

Coba ini,

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

Saya baru saja menguji ini dan berhasil untuk saya. Saya melakukan sinkronisasi 2 arah antara Windows7 (menggunakan cygwin dengan paket rsync terinstal) dan fileserver FreeNAS (FreeNAS berjalan di FreeBSD dengan paket rsync yang sudah diinstal sebelumnya).

Chris Collins
sumber
3
Apakah ini tidak akan menghapus file lokal baru? -umelewatkan file yang lebih baru di tujuan, tetapi rsync tidak memiliki cara untuk melacak usia penghapusan, jadi bagaimana skrip ini bisa membedakan antara kapan file lokal baru (dan harus disimpan) atau lama (dan harus dihapus) ? Atau apakah saya salah paham?
Matthemattics
Apakah --delete-excludedmenghapus file yang ada di direktori tujuan tetapi bukan direktori sumber? Saya pikir Anda harus mendefinisikan --exclude=<filename>jadi bukankah rsync hanya menghapus pengecualian ini? Atau apakah rsync memperlakukan semua file direktori non-sumber sebagai "tidak termasuk"?
Mr_Moneybags
2
Menemukan jawabannya: Selain menghapus file di sisi penerima yang tidak ada di sisi pengirim, ini memberitahu rsync untuk juga menghapus file apa pun di sisi penerima yang dikecualikan (lihat --exclude) rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags
2
Dari apa yang saya pahami, jika saya membuat file di tujuan dan kemudian menjalankan perintah rsync untuk menyalin dari sumber ke tujuan, itu akan menghapus file di tujuan, karena tidak ada stempel waktu yang digunakan. Ini bukan yang kamu inginkan, kan?
elexhobby
10
@ Lübnah: Benar; solusi ini bukan 2-jalan penuh sync : Karena rsync dengan --delete-excludeddijalankan dengan server yang sebagai sumber pertama: file ditambahkan secara lokal akan dihapus selama menjalankan bahwa (sedangkan file yang ditambahkan ke server yang sedang disalin ke target lokal). Satu-satunya file lokal yang disinkronkan kembali ke server adalah file yang juga ada di server dan dimodifikasi secara lokal (lebih baru dari versi server) - yang tidak mungkin ada dalam skenario OP. Seperti yang Anda berikan petunjuk, sinkronisasi 2-arah yang benar dari methinks tidak dapat dilakukan dengan rsync, karena status penyimpanan antar proses diperlukan.
mklement0
3

Anda dapat mencoba csync , ini adalah mesin sinkronisasi di bawah kap owncloud .

marton78
sumber
2
Pada tahun 2018, pengembangan csync tampaknya terhenti dan owncloud terlihat seperti bercabang. Lihat: github.com/owncloud/client/issues/4661 untuk detail lebih lanjut
Aaron
1

Saya sekarang menggunakan SparkleShare https://www.sparkleshare.org/

bekerja di mac, linux dan windows.

mwm
sumber
seiring berjalannya waktu, saya terus mengupdate solusi saya. Saya sekarang menggunakan nextcloud di server rumah saya. menyinkronkan dengan klien nextcloud di linux, mac, windows, android dan ios.
mwm
0

Saya tidak yakin apakah ini berfungsi dengan dua sinkronisasi tetapi agar --delete berfungsi, Anda juga perlu menambahkan parameter --recursive juga.

Boardy
sumber
1
Setara singkat opsi --recurseadalah -r, yang OP adalah menggunakan (tertanam dalam kelompok terkompresi-opsi -avzru).
mklement0
0

Anda dapat menggunakan cloudync untuk menjaga folder tetap sinkron dengan remote:

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

Jika remote-nya adalah NFS, Anda dapat menggunakan:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs
Erik Aronesty
sumber
-1

Rclone adalah apa yang Anda cari. Rclone ("rsync for cloud storage") adalah program baris perintah untuk menyinkronkan file dan direktori ke dan dari penyedia penyimpanan cloud yang berbeda termasuk sistem file lokal. Rclone sebelumnya dikenal sebagai Swiftsync dan telah tersedia sejak 2013.

pengguna1461607
sumber
Ini tidak mendukung sinkronisasi dua arah: rclone.org/commands/rclone_sync
Martin Braun