ซิงค์สองทางกับ rsync


97

ฉันมีโฟลเดอร์ a / และโฟลเดอร์ระยะไกล A / ตอนนี้ฉันเรียกใช้สิ่งนี้บน 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

เมื่อฉันสร้างซิงโครไนซ์เพลงสิ่งแรกจะได้รับความแตกต่างทั้งหมดจากเซิร์ฟเวอร์ไปยังโลคัลจากนั้นตรงกันข้ามส่งความแตกต่างทั้งหมดจากโลคัลไปยังเซิร์ฟเวอร์

ซึ่งจะใช้ได้ดีก็ต่อเมื่อมีการอัปเดตหรือไฟล์ใหม่ในอนาคตเท่านั้น หากมีการลบก็ไม่ได้ทำอะไร

ใน rsync มีตัวเลือก --delete และ --delete-after เพื่อช่วยให้บรรลุสิ่งที่ฉันต้องการ แต่สิ่งที่เป็นอยู่มันใช้ไม่ได้กับ 2-way-sync

หากฉันต้องการลบไฟล์เซิร์ฟเวอร์ในการซิงค์เมื่อไฟล์ในเครื่องถูกลบมันก็ใช้งานได้ แต่ถ้าด้วยเหตุผลบางประการ (อธิบายไว้ภายหลัง) ฉันมีไฟล์บางไฟล์ที่ไม่ได้อยู่ในเซิร์ฟเวอร์ แต่มีอยู่ในเครื่องและไฟล์เหล่านั้นถูกลบ ฉันต้องการลบออกในเครื่องและไม่คัดลอกเซิร์ฟเวอร์ (ตามที่เกิดขึ้น)

สิ่งที่ฉันมี 3 เครื่องในบริบท:

  1. เดสก์ทอป
  2. สมุดบันทึก
  3. โฮมเซิร์ฟเวอร์

ดังนั้นในบางครั้งเซิร์ฟเวอร์จะมีไฟล์ที่ถูกลบด้วยการซิงค์สมุดบันทึกเป็นต้นจากนั้นเมื่อฉันเรียกใช้การซิงค์กับเดสก์ท็อปของฉัน (ซึ่งไฟล์เซิร์ฟเวอร์ที่ถูกลบยังคงมีอยู่) ฉันต้องการให้ไฟล์เหล่านี้ถูกลบและไม่ควร คัดลอกอีกครั้งไปยังเซิร์ฟเวอร์

ฉันเดาว่านี่เป็นไปได้เฉพาะกับฐานข้อมูลและการติดตามการดำเนินงาน: P

วิธีแก้ปัญหาที่ง่ายกว่านี้หรือไม่? ขอขอบคุณ.


1
ฉันมีปัญหาเดียวกันนี้ คุณพบวิธีแก้ไขหรือไม่ mwm?
mouche

7
ตอนนี้ฉันทำได้จริง ฉันพยายามบรรลุดรอปบ็อกซ์เหมือนประสบการณ์และหาโซลูชันที่เกี่ยวข้องกับความพร้อมเพรียง (ที่ใช้ rsync) และ lsyncd สำหรับการตรวจสอบการเปลี่ยนแปลงไฟล์ ฉันยังพบคนอื่น ๆ ด้วยวิธีนี้และเทคนิคอื่น ๆ ที่ด้านบน» cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm

ทุกวันนี้ฉันใช้ nextcloud บนเซิร์ฟเวอร์ที่บ้านของฉัน "ดรอปบ็อกซ์" ที่สมบูรณ์แบบจัดการโดยฉันได้ 100% มีไคลเอนต์ android / ios / win / macos / linux / web
mwm

คำตอบ:


62

ลอง Unison: http://www.cis.upenn.edu/~bcpierce/unison/

ไวยากรณ์: unison dirA/ dirB/

Unison ถามว่าจะทำอย่างไรเมื่อไฟล์แตกต่างกัน แต่คุณสามารถทำให้กระบวนการเป็นอัตโนมัติได้โดยใช้ตัวเลือกต่อไปนี้ซึ่งยอมรับตัวเลือกเริ่มต้น (ไม่ขัดแย้งกัน):

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ ไม่ถามคำถามใด ๆ เลยและเขียนเพื่อแสดงจำนวนไฟล์ที่ถูกละเว้น (เพราะขัดแย้งกัน)


7
Unison นั้นค่อนข้างใช้งานง่ายสำหรับไดเรกทอรีขนาดเล็ก แต่มันช้าอย่างมากสำหรับไดเร็กทอรีที่มีไฟล์จำนวนมาก โดย rsync จะเริ่มคัดลอกเกือบจะทันทีบางครั้งพร้อมเพรียงกันใช้เวลามากกว่า 12 ชั่วโมงในการเริ่มคัดลอกเนื่องจากจะสแกนไฟล์ทุกไฟล์ก่อนที่จะคัดลอก
Brent Faust

1
มันคอมไพล์ที่ดีในเรื่องนี้? อย่างน้อยคอมไพล์เป็นเรื่องง่ายในการใช้งานและการขนส่งเป็นหยด fast.for มีการขยายการพัฒนาโดย GitHub เรียกว่าการจัดเก็บไฟล์ขนาดใหญ่
wener

1
ปัญหาหลักของคอมไพล์คือไฟล์ขนาดใหญ่และได้รับการออกแบบมาสำหรับการคอมมิตอย่างชัดเจน ทั้งสองอย่างสามารถปรับปรุงได้อย่างสมเหตุสมผลโดยส่วนเสริมเช่น git-annex ที่เก็บไฟล์ขนาดใหญ่เป็นต้น
alex

3
@wener อย่าใช้ค้อนสำหรับสกรูหรือไขควงสำหรับตะปู :)
ADTC

3
ความพร้อมเพรียงนั้นยอดเยี่ยม - แต่ก็ไม่น่าเชื่อถือเช่นกัน ประมาณ 50% ของกรณีการใช้งานของฉันมันเรียบง่ายไม่ได้ผล สาเหตุที่พบบ่อยที่สุดคือความสามารถระหว่างเวอร์ชันที่ไม่ดี บางครั้งฉันซิงค์กับเนื้อหาบนคอมพิวเตอร์ที่ฉันไม่มีสิทธิ์ หากเซิร์ฟเวอร์นั้นมีเวอร์ชันที่แตกต่างจากที่ฉันทำขึ้นพร้อมกันจะล้มเหลว นอกจากนี้ฉันเพิ่งประสบความล้มเหลวระหว่างไคลเอนต์พร้อมเพรียงในเวอร์ชันเดียวกันเนื่องจากใช้ไลบรารีบางเวอร์ชันที่คอมไพล์แตกต่างกัน (นี่คือระหว่างคอมพิวเตอร์อูบุนตูและราสเบอร์รี่ pi)
argentum2f


7

เนื่องจากคำถามเดิมยังเกี่ยวข้องกับเดสก์ท็อปและแล็ปท็อปและตัวอย่างที่เกี่ยวข้องกับไฟล์เพลง (ดังนั้นเขาอาจใช้ GUI) ฉันจึงพูดถึงหนึ่งในโปรแกรมสองทิศทางหลายแพลตฟอร์มฟรีและโอเพ่นซอร์สที่ดีที่สุดจนถึงปัจจุบัน: FreeFileSync .

มันใช้ GUI รวดเร็วและใช้งานง่ายมาพร้อมกับการกรองและตัวเลือกอื่น ๆ อีกมากมายรวมถึงความสามารถในการเชื่อมต่อระยะไกลเพื่อดูและจัดการ "การชน" แบบโต้ตอบ (เช่นไฟล์ที่มีการประทับเวลาที่คล้ายกัน) และเพื่อสลับระหว่างการถ่ายโอนแบบสองทิศทางการมิเรอร์และ เป็นต้น.


5

คุณอาจใช้ Osync: http://www.netpower.fr/osyncซึ่งใช้ rsync กับการเผยแพร่การลบอัจฉริยะ นอกจากนี้ยังมีตัวเลือกมากมายเช่นการหยุดการดำเนินการต่อการหยุดการลบแบบซอฟต์และการควบคุมเวลา


4

ลองสิ่งนี้

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

ฉันแค่ทดสอบสิ่งนี้และมันได้ผลสำหรับฉัน ฉันกำลังทำการซิงค์ 2 ทางระหว่าง Windows7 (โดยใช้ cygwin ที่ติดตั้งแพ็คเกจ rsync) และเซิร์ฟเวอร์ไฟล์ FreeNAS (FreeNAS ทำงานบน FreeBSD โดยติดตั้งแพ็คเกจ rsync ไว้ล่วงหน้า)


3
สิ่งนี้จะไม่ลบไฟล์ในเครื่องใหม่หรือไม่? -uข้ามไฟล์ที่ใหม่กว่าไปที่ปลายทาง แต่ rsync ไม่มีวิธีติดตามอายุของการลบดังนั้นสคริปต์นี้จะแยกความแตกต่างระหว่างเวลาที่ไฟล์ในเครื่องเป็นไฟล์ใหม่ได้อย่างไร (และควรเก็บไว้) หรือเก่า (และควรลบทิ้ง) เหรอ? หรือว่าฉันเข้าใจผิด?
Matthemattics

ไม่--delete-excludedลบไฟล์ใด ๆ ที่มีอยู่ในไดเรกทอรีปลายทาง แต่ไม่ไดเรกทอรีแหล่งที่มา? ฉันคิดว่าคุณต้องกำหนด--exclude=<filename>ดังนั้น rsync จะไม่ลบเฉพาะการยกเว้นเหล่านี้หรือไม่? หรือ rsync ถือว่าไฟล์ไดเรกทอรีที่ไม่ใช่ซอร์สทั้งหมดเป็น "excludes"?
Mr_Moneybags

2
พบคำตอบ: นอกเหนือจากการลบไฟล์ในฝั่งรับที่ไม่ได้อยู่ฝั่งที่ส่งแล้วสิ่งนี้จะบอกให้ rsync ลบไฟล์ใด ๆ ในฝั่งรับที่ถูกยกเว้นด้วย (ดู - ไม่รวม) rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags

2
จากสิ่งที่ฉันเข้าใจถ้าฉันสร้างไฟล์ที่ปลายทางแล้วเรียกใช้คำสั่ง rsync เพื่อคัดลอกจากต้นทางไปยังปลายทางไฟล์จะลบไฟล์ที่ปลายทางเนื่องจากไม่มีการใช้การประทับเวลา นี่ไม่ใช่สิ่งที่คุณต้องการใช่ไหม
elexhobby

10
@ Lübnah: ถูกต้อง; วิธีนี้คือไม่เต็มซิงค์ 2 ทาง : เพราะ rsync กับ--delete-excludedมีการเรียกใช้กับเซิร์ฟเวอร์เป็นแหล่งแรก: ไฟล์เพิ่มในประเทศจะถูกลบออกในระหว่างการทำงานนั้น (ในขณะที่ไฟล์เพิ่มไปยังเซิร์ฟเวอร์ จะถูกคัดลอกไปยังเป้าหมายท้องถิ่น) ไฟล์ภายในเครื่องเดียวที่ซิงค์กลับไปยังเซิร์ฟเวอร์คือไฟล์ที่มีอยู่บนเซิร์ฟเวอร์และได้รับการแก้ไขภายในเครื่อง (ล่าสุดกว่าเวอร์ชันเซิร์ฟเวอร์) ซึ่งไม่น่าจะเป็นไปได้ในสถานการณ์ของ OP ตามที่คุณบอกเป็นนัยว่าไม่สามารถทำการซิงค์ 2 ทางที่แท้จริงได้rsyncเนื่องจากจำเป็นต้องมีสถานะการบันทึกระหว่างการรัน
mklement0

3

คุณอาจจะลองcsyncมันเป็นเครื่องมือซิงค์ภายใต้ประทุนของowncloud


2
ในปี 2018 การพัฒนา csync ดูเหมือนจะหยุดชะงักและเป็นเจ้าของคลาวด์ดูเหมือนว่าพวกเขากำลังทำมัน ดู: github.com/owncloud/client/issues/4661สำหรับรายละเอียดเพิ่มเติม
Aaron

1

ตอนนี้ฉันใช้ SparkleShare https://www.sparkleshare.org/

ทำงานบน mac, linux และ windows


เมื่อเวลาผ่านไปฉันอัปเดตโซลูชันของฉันอยู่เสมอ ตอนนี้ฉันใช้ nextcloud บนเซิร์ฟเวอร์ที่บ้าน การซิงค์กับไคลเอนต์ nextcloud บน linux, mac, windows, android และ ios
mwm

0

ฉันไม่แน่ใจว่ามันใช้ได้กับการซิงค์สองครั้งหรือไม่ แต่เพื่อให้ --delete ทำงานได้คุณต้องเพิ่มพารามิเตอร์ --recursive ด้วย


1
เทียบเท่าสั้น ๆ ของตัวเลือกที่--recurseเป็น-rที่สหกรณ์จะใช้ (ฝังตัวอยู่ในกลุ่มที่ถูกบีบอัดตัวเลือก-avzru)
mklement0

0

คุณสามารถใช้cloudsyncเพื่อให้โฟลเดอร์ซิงค์กับรีโมท:

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

หากรีโมตเป็น NFS คุณสามารถใช้:

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

-1

Rcloneคือสิ่งที่คุณกำลังมองหา Rclone ("rsync สำหรับที่เก็บข้อมูลบนคลาวด์") เป็นโปรแกรมบรรทัดคำสั่งเพื่อซิงค์ไฟล์และไดเร็กทอรีไปยังและจากผู้ให้บริการจัดเก็บข้อมูลบนคลาวด์ต่างๆรวมถึงระบบไฟล์ในเครื่อง ก่อนหน้านี้ Rclone รู้จักกันในชื่อ Swiftsync และวางจำหน่ายตั้งแต่ปี 2013


ไม่รองรับการซิงค์สองทาง: rclone.org/commands/rclone_sync
Martin Braun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.