จะทำให้สองโฟลเดอร์ซิงโครไนซ์โดยอัตโนมัติได้อย่างไร?


92

ฉันต้องการสำเนาที่ซิงโครไนซ์ของโฟลเดอร์เดียวกับแผนผังย่อยทั้งหมด

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

แนวทางใดดีที่สุดสำหรับงานนี้

BTW: ฉันใช้ Ubuntu 12.04

เป้าหมายสุดท้ายคือการมีสำเนาสำรองแบบเรียลไทม์ที่แยกจากกันโดยไม่ต้องใช้ symlinks หรือ mount ฉันใช้ Ubuntu One เพื่อซิงโครไนซ์ข้อมูลระหว่างคอมพิวเตอร์ของฉันและหลังจากนั้นไม่นานก็เกิดข้อผิดพลาดและข้อมูลทั้งหมดของฉันหายไประหว่างการซิงโครไนซ์

ดังนั้นฉันจึงคิดที่จะเพิ่มขั้นตอนต่อไปเพื่อเก็บสำเนาสำรองข้อมูลของฉัน:

  • ฉันเก็บข้อมูลของฉันไว้ใน "โฟลเดอร์ A"
  • ฉันต้องการคำตอบสำหรับคำถามปัจจุบันของฉันเพื่อสร้างการซิงค์ทางเดียวของ "โฟลเดอร์ A" กับ "โฟลเดอร์ B" ( cronสคริปต์ที่มีrsync? อาจเป็น?) ฉันต้องการให้มันเป็นแบบทางเดียวเท่านั้นจาก A ถึง B การเปลี่ยนแปลงใด ๆ กับ B จะต้องไม่ใช้กับ A
  • ฉันเพียงแค่ให้ "โฟลเดอร์ B" ที่ซิงโครไนซ์กับ Ubuntu One

    ในลักษณะนี้การเปลี่ยนแปลงใด ๆ ใน A จะถูกนำไปใช้กับ B ซึ่งจะตรวจพบจาก U1 และซิงโครไนซ์กับคลาวด์ หากมีอะไรผิดพลาดและ U1 ลบข้อมูลของฉันบน B ฉันจะมีข้อมูลเหล่านี้ใน A เสมอ

แรงบันดาลใจจากความคิดเห็นของ lanzz แนวคิดอีกอย่างหนึ่งคือการเรียกใช้ rsync เมื่อเริ่มต้นเพื่อสำรองข้อมูลเนื้อหาของโฟลเดอร์ภายใต้ Ubuntu One และเริ่ม Ubuntu One หลังจาก rsync เสร็จสิ้นเท่านั้น

คุณคิดยังไงเกี่ยวกับที่? จะรู้ได้อย่างไรว่า rsync สิ้นสุดเมื่อใด


คุณพยายามทำอะไรให้สำเร็จ? โฟลเดอร์จำเป็นต้องแยกจากกันอย่างแท้จริงคุณไม่สามารถเชื่อมโยงชื่อหนึ่งไปยังอีกชื่อหนึ่งหรือเชื่อมโยงไดเรกทอรีกับตำแหน่งรองได้หรือไม่? ดูผลการค้นหาเหล่านี้ด้วย
lanzz

1
ผมแนะนำให้กับการประสานสดที่เกิดขึ้นจริง (คือดูอย่างต่อเนื่องสำหรับการเปลี่ยนแปลงแฟ้มในไดเรกทอรีต้นทาง) ในความโปรดปรานของระยะrsyncทาง cron
lanzz

คำตอบ:


103

คุณสามารถใช้inotifywait(โดยmodify,create,delete,moveเปิดใช้งานแฟล็ก) และrsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

หากคุณไม่มีinotifywaitในระบบของคุณให้เรียกใช้sudo apt-get install inotify-tools


3
คุณอาจต้องการพิจารณาที่จะเพิ่ม-e ssh user@remote:/targetการrsyncถ้าคุณต้องการที่จะใช้ SSH การขนส่งเพื่อเข้าถึงเครื่องระยะไกลของคุณ
Falcon

2
ขอบคุณ @Falcon rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:pathผมมักจะใช้ อย่างไรก็ตามฉันต้องการเขียนคำตอบง่ายๆ
silgon

5
ชี้แจง: นี่เป็นสิ่งที่เรียกใช้ครั้งเดียวหรือคุณจะเพิ่มสิ่งนี้ลงใน bashrc หรืออะไร?
Brad Johnson

1
คุณสามารถพิจารณาทั้ง while loop เป็นกระบวนการที่ซิงโครไนซ์เมื่อจำเป็น ฉันมักจะเพิ่มลงใน Makefile ของโปรเจ็กต์ที่ฉันกำลังทำอยู่ ด้วยวิธีนี้ฉันสามารถเลือกเซิร์ฟเวอร์และไดเร็กทอรีที่ต้องการบันทึกได้ หนึ่งในกรณีการใช้งานของฉันคือเมื่อฉันตั้งโปรแกรมอัลกอริทึมการเรียนรู้เชิงลึกในแล็ปท็อปของฉันและฉันซิงโครไนซ์เพื่อดำเนินการขั้นตอนหนักในคอมพิวเตอร์เฉพาะที่มี CPU และ GPU ที่ดีกว่า ฉันยังยกเว้นไฟล์ที่ไม่ต้องการเช่น.gitโฟลเดอร์
silgon

2
สิ่งนี้ไม่ได้จัดการกับการเปลี่ยนชื่อไฟล์ให้ใช้modify,create,delete,move
urusha

25

คุณต้องการสิ่งนี้: https://github.com/axkibe/lsyncd เป็นเครื่องมือที่รวม rsync และ inotify - อดีตเป็นเครื่องมือที่สะท้อนพร้อมกับชุดตัวเลือกที่ถูกต้องไดเรกทอรีไปยังบิตสุดท้าย ตัวหลังบอกให้เคอร์เนลแจ้งโปรแกรมการเปลี่ยนแปลงไฟล์ ot ไดเร็กทอรี มันบอกว่า:

จะรวมและรวมเหตุการณ์เป็นเวลาสองสามวินาทีจากนั้นสร้างกระบวนการหนึ่ง (หรือมากกว่า) เพื่อซิงโครไนซ์การเปลี่ยนแปลง

แต่ - อ้างอิงจาก Digital Ocean ที่https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - ควรอยู่ใน ที่เก็บ Ubuntu!

ฉันมีข้อกำหนดที่คล้ายกันและเครื่องมือนี้ซึ่งฉันยังไม่ได้ลองดูเหมือนว่าจะเหมาะกับงานนั้น


1
ตอนแรก lsyncd ดูเหมือนกระสุนเงิน แต่มีปัญหามากมายที่เปิดอยู่และเห็นได้ชัดว่าการใช้งาน macOS นั้น "เก่าและล้าสมัย" ฉันไม่สามารถใช้งานได้ในวันที่ 10.12
เนิร์ดจ่าย

@apaidnerd เพื่อความเป็นธรรมมันเปิด 90 ประเด็นเทียบกับ 420 ปิด แม้ว่าจะมีเพียง 10/40 ฉบับเท่านั้นที่ปิดในปีที่แล้ว
Mateen Ulhaq

8

เพียงแค่ปรับเปลี่ยนคำตอบ @silgon ง่ายๆ:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(รุ่น @silgon บางครั้งขัดข้องบน Ubuntu 16 ถ้าคุณเรียกใช้ใน cron)


2
ทำไมคุณถึงเรียกใช้ใน cron?
saygley

@saygley สำหรับงานเฉพาะหลังจาก Ubuntu รีบูตกระบวนการซิงค์ควรรันโดยอัตโนมัติ
Denis Kuzin

5
ฉันเห็น .. อย่างไรก็ตามเนื่องจากปกติแล้วสิ่งนี้ควรจะเริ่มต้นเพียงครั้งเดียวและทำงานได้ตราบเท่าที่เซิร์ฟเวอร์ยังทำงานอยู่ ฉันจะพิจารณาบางสิ่งที่แทรกอยู่ภายใน rc.local แทน
saygley

2

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


0

ฉันใช้โปรแกรมฟรีนี้เพื่อซิงโครไนซ์ไฟล์และไดเร็กทอรีในเครื่อง: https://github.com/Fitus/Zaloha.sh https://github.com/Fitus/Zaloha.shพื้นที่เก็บข้อมูลมีการสาธิตอย่างง่ายเช่นกัน

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

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