Bạn cần chạy rsync
hai lần và tôi khuyên bạn nên chạy nó với -au
:
rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source
-a
(a cho kho lưu trữ) là một phím tắt cho -rlptgoD
:
-r
Đệ quy vào thư mục con
-l
Đồng thời đồng bộ hóa các liên kết tượng trưng
-p
Đồng thời đồng bộ hóa quyền đối với tệp
-t
Đồng thời đồng bộ hóa thời gian sửa đổi tệp
-g
Đồng thời đồng bộ hóa các nhóm tệp
-o
Cũng đồng bộ hóa chủ sở hữu tệp
-D
Đồng thời đồng bộ hóa các tệp đặc biệt (không phải thông thường / meta)
Về cơ bản bất cứ khi nào bạn muốn tạo một bản sao giống hệt một-một bằng cách sử dụng rsync
, bạn nên luôn sử dụng -a
vì đó là điều mà hầu hết người dùng mong đợi sẽ xảy ra khi họ nói về " đồng bộ hóa ". Các câu trả lời khác ở đây dường như bỏ qua rằng đôi khi nội dung của tệp không thay đổi nhưng chủ sở hữu của tệp có thể đã thay đổi hoặc quyền truy cập của tệp có thể đã thay đổi và trong trường hợp đórsync
đó sẽ không đồng bộ hóa tệp, điều này có thể gây tử vong.
Nhưng bạn cũng yêu cầu -u
như vậy yêu cầu rsync
hoàn toàn để yên bất kỳ tệp / thư mục nào, trong trường hợp tệp / thư mục đó đã tồn tại ở đích và có ngày sửa đổi cuối cùng mới hơn. Nếu không có -u
rsync
sẽ đồng bộ hóa bất kể tệp / thư mục có mới hơn hay không .
Xin lưu ý rằng giải pháp này không thể xử lý các tệp đã xóa. Không dễ dàng xử lý việc xóa vì hãy xem xét tình huống sau: Một tệp đã bị xóa tại nguồn, bây giờ làm thế nào để rsync
biết liệu tệp đó đã từng tồn tại và đã bị xóa hay chưa (trong trường hợp đó, nó cũng phải được xóa tại đích) hoặc liệu nó chưa bao giờ tồn tại tại nguồn (trong trường hợp đó nó phải được sao chép từ đích). Hai tình huống này trông giống hệt nhau rsync
nên nó không thể biết cách phản ứng chính xác. Sẽ không hữu ích khi đồng bộ theo cách khác vì điều đó có thể dẫn đến tình huống tương tự: Tệp tồn tại ở nguồn nhưng không tồn tại ở đích. Tại sao? Nó chưa bao giờ tồn tại ở điểm đến hoặc nó đã bị xóa? Cả hai trường hợp trông giống hệt nhau rsync
.
Các công cụ đồng bộ hóa có thể đồng bộ hóa các tệp đã xóa một cách đáng tin cậy thường quản lý nhật ký đồng bộ hóa về tất cả các hoạt động đồng bộ hóa trước đây. Nếu nhật ký đó tiết lộ rằng đã từng có một tệp và đã được đồng bộ hóa nhưng bây giờ nó bị mất, rõ ràng là nó đã bị xóa. Nếu không bao giờ có một tệp như vậy theo nhật ký, nó phải được đồng bộ hóa. Bằng cách lưu trữ tất cả các mục nhật ký bằng dấu thời gian, thậm chí có thể một tệp đã xóa quay trở lại và bị xóa nhiều lần nhưng công cụ đồng bộ hóa sẽ luôn biết phải làm gì và kết quả luôn chính xác. rsync
không có nhật ký như vậy, nó chỉ dựa vào trạng thái tệp hiện tại của hai mặt của hoạt động.
Tuy nhiên, bạn có thể xây dựng cho mình một lệnh đồng bộ hóa bằng cách sử dụng rsync
và tập lệnh shell POSIX bit vốn đã rất gần với một công cụ đồng bộ hóa như được mô tả ở trên. Vì bản thân tôi cần một công cụ như vậy, đây là câu trả lời trên Stackoverflow hướng dẫn bạn cách tạo một tập lệnh như vậy.