Làm thế nào để giữ hai thư mục được đồng bộ hóa tự động?


87

Tôi muốn có một bản sao đồng bộ của một thư mục với tất cả cây con của nó.

Nó sẽ tự động hoạt động theo cách này: bất cứ khi nào tôi tạo, sửa đổi hoặc xóa nội dung khỏi thư mục gốc, những thay đổi đó sẽ được tự động áp dụng cho thư mục đồng bộ hóa.

Cách tiếp cận tốt nhất cho nhiệm vụ này là gì?

BTW: Tôi đang sử dụng Ubuntu 12.04

Mục tiêu cuối cùng là có một bản sao lưu thời gian thực riêng biệt mà không cần sử dụng liên kết tượng trưng hoặc gắn kết. Tôi đã sử dụng Ubuntu One để đồng bộ hóa dữ liệu giữa các máy tính của mình và sau một thời gian đã xảy ra sự cố và tất cả dữ liệu của tôi đã bị mất trong quá trình đồng bộ hóa.

Vì vậy, tôi nghĩ phải thêm một bước nữa để giữ một bản sao lưu dữ liệu của mình:

  • Tôi lưu trữ dữ liệu của mình trên "thư mục A"
  • Tôi cần câu trả lời cho câu hỏi hiện tại của mình để tạo đồng bộ hóa một chiều từ "thư mục A" với "thư mục B" ( crontập lệnh với rsync? Có thể là?). Tôi cần nó chỉ là một chiều từ A đến B mọi thay đổi đối với B không được áp dụng cho A.
  • Tôi chỉ cần giữ "thư mục B" được đồng bộ hóa với Ubuntu One

    Theo cách này, bất kỳ thay đổi nào trong A sẽ được gắn vào B, sẽ được phát hiện từ U1 và đồng bộ hóa với đám mây. Nếu có gì sai và U1 xóa dữ liệu của tôi trên B, tôi luôn có chúng trên A.

Lấy cảm hứng từ nhận xét của lanzz, một ý tưởng khác có thể là chạy rsync khi khởi động để sao lưu nội dung của một thư mục trong Ubuntu One và chỉ khởi động Ubuntu One sau khi rsync hoàn tất.

Bạn nghĩ gì về điều này? Làm thế nào để biết khi nào rsync kết thúc?


Bạn đang cố gắng để thực hiện? Các thư mục có thực sự cần phải tách biệt, bạn không thể liên kết tượng trưng tên này với tên kia hoặc liên kết gắn kết thư mục vào vị trí phụ? Ngoài ra, hãy xem các kết quả tìm kiếm này .
lanzz

1
Tôi muốn tư vấn cho chống lại đồng bộ hóa sống thực tế (tức là xem liên tục thay đổi tập tin trong thư mục nguồn) có lợi cho tuần hoàn rsyncqua cron.
lanzz

Câu trả lời:


100

Bạn có thể sử dụng inotifywait(với các modify,create,delete,movecờ được bật) và rsync.

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

Nếu bạn không có inotifywaittrên hệ thống của mình, hãy chạysudo apt-get install inotify-tools


3
Bạn có thể muốn xem xét thêm -e ssh user@remote:/targetvào rsyncnếu bạn muốn sử dụng SSH làm phương tiện truyền tải để truy cập vào máy tính từ xa của mình.
Falcon

2
Cảm ơn @Falcon, tôi thường sử dụng rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Tuy nhiên tôi muốn viết một câu trả lời đơn giản.
silgon

4
để làm rõ: đây có phải là một việc chạy một lần hay bạn sẽ thêm nó vào một bashrc hay thứ gì đó?
Brad Johnson

1
Bạn có thể coi toàn bộ vòng lặp while như một quá trình đồng bộ hóa khi cần thiết. Tôi thường thêm nó vào Makefile của dự án mà tôi đang thực hiện. Bằng cách này, tôi có thể chọn máy chủ và thư mục mà tôi muốn nó được lưu. Một trong những trường hợp sử dụng của tôi là khi tôi lập trình các thuật toán học sâu trong máy tính xách tay của mình và tôi đồng bộ hóa nó để thực hiện quá trình nặng trong một máy tính chuyên dụng có CPU và GPU tốt hơn. Tôi cũng loại trừ các tệp mà tôi không cần, chẳng hạn như .gitthư mục.
silgon

2
Điều này không xử lý đặt lại tên tập tin, sử dụngmodify,create,delete,move
urusha

24

Bạn cần một cái gì đó như thế này: https://github.com/axkibe/lsyncd Đây là một công cụ kết hợp rsync và inotify - công cụ trước đây là một công cụ phản chiếu, với các tùy chọn được đặt chính xác, một thư mục đến bit cuối cùng. Sau đó yêu cầu hạt nhân thông báo cho một chương trình về những thay đổi đối với một tệp ot thư mục. Nó nói rằng:

Nó tổng hợp và kết hợp các sự kiện trong vài giây và sau đó tạo ra một (hoặc nhiều) quy trình để đồng bộ hóa các thay đổi.

Nhưng - theo Digital Ocean tại https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - it must be in kho lưu trữ Ubuntu!

Tôi có các yêu cầu tương tự và công cụ này, mà tôi vẫn chưa thử, có vẻ phù hợp với nhiệm vụ.


1
Lúc đầu, lsyncd có vẻ giống như một viên đạn bạc, nhưng nó có rất nhiều vấn đề mở và dường như việc triển khai macOS đã "cũ và lỗi thời". Tôi không thể làm cho nó hoạt động vào ngày 10.12.
một mọt sách được trả tiền

@apaidnerd Công bằng mà nói, 90 vấn đề đang mở so với 420 vấn đề đã đóng. Mặc dù vậy, chỉ 10/40 số phát hành được đóng trong năm ngoái.
Mateen Ulhaq

8

Chỉ cần sửa đổi đơn giản câu trả lời @silgon:

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

(Phiên bản @silgon đôi khi bị lỗi trên Ubuntu 16 nếu bạn chạy nó trong cron)


2
Tại sao bạn chạy nó trong cron?
saygley

@saygley Đối với một nhiệm vụ cụ thể, sau khi Ubuntu khởi động lại quá trình đồng bộ nên được chạy tự động
Denis Kuzin

5
Tôi hiểu rồi .. Tuy nhiên, vì điều này thường phải được bắt đầu một lần và chạy miễn là máy chủ hoạt động; Thay vào đó, tôi sẽ xem xét một cái gì đó được nội tuyến trong rc.local.
saygley 24/09/18

2

Bạn có thể tận dụng lợi thế của fschange . Đó là một thông báo thay đổi hệ thống tệp Linux. Mã nguồn có thể tải về từ liên kết trên, bạn có thể tự biên dịch. fschangecó thể được sử dụng để theo dõi các thay đổi của tệp bằng cách đọc dữ liệu từ tệp proc (/ proc / fschange). Khi dữ liệu được ghi vào tệp, fschange báo cáo khoảng thời gian chính xác đã được sửa đổi thay vì chỉ nói rằng tệp đã được thay đổi. Nếu bạn đang tìm kiếm giải pháp nâng cao hơn, tôi khuyên bạn nên kiểm tra Resilio Connect . Nó là đa nền tảng, cung cấp các tùy chọn mở rộng để sử dụng và giám sát. Vì nó dựa trên BitTorrent, nó nhanh hơn bất kỳ công cụ đồng bộ hóa hiện có nào khác. Nó được viết thay cho họ.


0

Tôi sử dụng chương trình miễn phí này để đồng bộ hóa các tệp và thư mục cục bộ: https://github.com/Fitus/Zaloha.sh . Kho lưu trữ cũng chứa một bản demo đơn giản.

Điểm tốt: Nó là một tập lệnh shell bash (chỉ một tệp). Không phải là hộp đen như các chương trình khác. Tài liệu cũng có ở đó. Ngoài ra, với một số tài năng kỹ thuật, bạn có thể "bẻ cong" và "tích hợp" nó để tạo ra giải pháp cuối cùng mà bạn thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.