it-swarm-vi.com

Yêu cầu rsync xóa các tệp ở phía nhận không tồn tại ở phía gửi, ngoại trừ ở phía nhận

Tôi đã đọc những chủ đề này:

Nhưng, theo như tôi có thể nói (có thể tôi đang thiếu thứ gì đó), họ không bao gồm câu hỏi sau:

Làm thế nào để bạn yêu cầu rsync sao chép các tệp và xóa các tệp ở phía bên nhận không tồn tại ở phía gửi, ngoại trừ? (ví dụ: không xóa kho lưu trữ Mercurial .hg ở phía bên nhận, ngay cả khi không có kho lưu trữ ở phía gửi).

Một khả năng?

Mượn từ câu trả lời của @Richard Holloway bên dưới. Nói rằng tôi có dòng sau:

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

Theo tôi hiểu, dòng này sẽ khiến rsync xóa mọi thứ trên đường dẫn nhận không tồn tại trên đường gửi, ngoại trừ những thứ được khớp bởi dont_delete_me. Câu hỏi của tôi bây giờ là: Liệu rsync có giữ các tệp ở phía bên nhận được khớp với dont_delete_me ngay cả khi không có gì ở phía gửi khớp với dont_delete_me?

29
Amelio Vazquez-Reina

Nếu bạn dùng --delete--exclude cùng với những gì ở vị trí bị loại trừ sẽ không bị xóa ngay cả khi các tệp nguồn bị xóa.

Nhưng điều đó đặt ra vấn đề rằng thư mục sẽ không phải là rsync 'd. Vì vậy, bạn sẽ cần một rsync job để sync thư mục đó.

Ví dụ.

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

Bạn có thể chạy những cách này theo cách khác, nhưng sau đó nó sẽ xóa tất cả các tệp đã xóa và sau đó thay thế chúng, điều này không hiệu quả.

Bạn không thể làm điều đó như một lớp lót.

33
Richard Holloway

Tôi thấy rằng giải pháp sau đây hoạt động cho mục đích của tôi:

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(Lưu ý: Thêm -n tùy chọn để chạy khô và không thay đổi --delete đến --delete-excluded!)

Chạy lệnh gây ra các thuộc tính sau:

  • Thư mục nguồn src vẫn chưa được sửa đổi
  • Thư mục đích dest khớp với thư mục nguồn ngoại trừ:

    • các mục trên do_not_send_to_dest danh sách không được gửi đến đích và
    • các mục trên do_not_modify_in_dest danh sách được để lại không thay đổi ở đích.
  • (Lưu ý: Không có vấn đề gì đối với các mục không tồn tại được liệt kê trong một trong hai "do_not_" các tập tin.)

Giải thích

Tôi đoán khi rsync đọc các đối số dòng lệnh từ trái sang phải, --delete đối số dường như khiến rsync chuyển sang "chế độ chuyển đổi" bên trong (theo nghĩa nào đó), cho phép sử dụng lần thứ hai --exclude-from tùy chọn một lần nữa nhưng với một ý nghĩa khác.

Hãy cẩn thận:

  • Nếu một mục trên do_not_send_to_dest danh sách đã tồn tại ở đích, sau đó:

    • lệnh này không xóa mục đó khỏi đích (trừ khi mục đầu tiên bị xóa khỏi thư mục nguồn)
    • Chú ý : thay đổi --delete đến --delete-excluded sẽ xóa mọi thứ ở đích được liệt kê trên một trong hai danh sách của bạn. xD (Có lẽ rsync được viết là mở/linh hoạt, nhưng có một số sắc thái?)

Sử dụng nhẹ thử nghiệm.

Tôi đang dùng "rsync version 3.0.9 protocol version 30 ".

4
user2533809