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


29

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 rsyncsao chép các tập tin và xóa những tập tin ở 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ữ .hgở phía 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ẽ rsyncxóa mọi thứ trên đường 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à: rsync có giữ các tệp ở phía bên nhận được khớp hay không dont_delete_me ngay cả khi không có gì ở phía gửi khớp dont_delete_me?

Câu trả lời:


33

Nếu bạn sử dụng --delete--excludecùng nhau 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 đề là thư mục sẽ không hoàn rsynctoàn. Vì vậy, bạn sẽ cần một rsynccông việc khác vào syncthư 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 chúng 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.


Cảm ơn @Richard. Câu trả lời của bạn đang khiến tôi nghĩ rằng câu hỏi ban đầu của tôi có thể dễ dàng hơn tôi nghĩ. Nếu tôi sử dụng một dòng duy nhất : rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path, sẽ không rsyncxóa mọi thứ trên đường nhận không tồn tại trên đường gửi, ngoại trừ những thứ khớp với dont_delete_me? Quan trọng nhất, sẽ rsyncgiữ mọi thứ ở 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 phù hợpdont_delete_me ? Nếu đó là trường hợp, tôi nghĩ đó là dòng duy nhất tôi cần, phải không?
Amelio Vazquez-Reina

Bạn đúng nhưng bạn cũng sẽ không nhận được các tệp mới và thay đổi thư mục dont_delete_me nếu bạn thực hiện trong một dòng. Nếu bạn không muốn đồng bộ hóa các thay đổi và bổ sung, thì bạn chỉ có thể sử dụng cờ --exclude như bạn mô tả ở đây.
Richard Holloway

@AmV Các tệp bị loại trừ không bị xóa bởi --delete, trừ khi bạn chỉ định rõ ràng --delete-excluded. Xem mô tả --delete--delete-excludedtrong hướng dẫn rsync.
Gilles 'SO- ngừng trở nên xấu xa'

4

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 -ntùy chọn để chạy khô và không thay đổi --deletethành --delete-excluded!)

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

  • Thư mục nguồn srcvẫn không thay đổi
  • destThư mục đích khớp với thư mục nguồn ngoại trừ:

    • các mục trong do_not_send_to_destdanh sách không được gửi đến đích và
    • các mục trong do_not_modify_in_destdanh 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 các do_not_tệp "".)

Giải trình

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 --exclude-fromlại tùy chọn thứ hai nhưng với ý nghĩa khác.

Hãy cẩn thận:

  • Nếu một mục trong do_not_send_to_destdanh sách đã tồn tại ở đích, thì:

    • 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)
    • Thận trọng: thay đổi --deletethành --delete-excludedsẽ 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 sử dụng " rsync version 3.0.9 protocol version 30".

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.