Xóa các tập tin không liên quan từ Dest dir qua rsync?


51

Nói tôi có

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Nó không xóa hello.jpg khỏi DEST, có ý tưởng nào để lưu trữ cái này không?

Câu trả lời:


72

Lý do lệnh của bạn không hoạt động được giải thích bởi trang hướng dẫn cho rsync (nhấn mạnh thêm):

--xóa bỏ

Điều này nói với rsync để xóa các tệp không liên quan khỏi phía nhận (những tệp không ở phía gửi), nhưng chỉ đối với các thư mục đang được đồng bộ hóa. Bạn phải yêu cầu rsync gửi toàn bộ thư mục (ví dụ: "dir" hoặc "dir /") mà không sử dụng ký tự đại diện cho nội dung của thư mục (ví dụ "dir / *") vì ký tự đại diện được mở rộng bởi shell và do đó rsync được mở rộng yêu cầu chuyển các tệp riêng lẻ, không phải thư mục mẹ của tệp. Các tệp bị loại trừ khỏi quá trình chuyển cũng bị loại trừ khỏi bị xóa trừ khi bạn sử dụng tùy chọn loại trừ --delete hoặc đánh dấu các quy tắc là chỉ khớp với bên gửi (xem phần sửa đổi bao gồm / loại trừ trong phần LỌC LỌC).

Vì vậy, khi bạn chạy

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

các tệp không mong muốn trong DEST sẽ không bị xóa vì thực tế bạn chưa yêu cầu đồng bộ hóa thư mục, nhưng chỉ cho một số ít tệp cụ thể. Để có được kết quả mà bạn mong muốn, hãy thử một cái gì đó như thế này:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Lưu ý rằng thứ tự bao gồm và loại trừ vấn đề chỉ thị. Về cơ bản, mỗi tệp được kiểm tra theo các mẫu bao gồm hoặc loại trừ theo thứ tự xuất hiện. Do đó, các tệp có phần mở rộng .jpg hoặc .txt được đồng bộ hóa do chúng khớp với các mẫu "được bao gồm" trước khi chúng khớp với mẫu "*" bị loại trừ. Mọi thứ khác được loại trừ bởi --exclude '*'mô hình. Các --delete-excludedĐảm bảo lựa chọn mà ngay cả các tập tin trên bên DEST loại trừ sẽ bị xóa.


@Cheng, quan tâm giải thích thêm một chút? Tôi rất vui lòng cập nhật câu trả lời của mình nếu có vấn đề / cải thiện.
Steven D

Nó hoạt động. Tôi đoán. Mọi thứ - process đang làm tôi bối rối, khiến tôi nghĩ rằng nó đã được chuyển lại.
Cheng

Tôi đã chỉnh sửa câu trả lời của mình để giải thích thêm một chút.
Steven D

2
@Cheng: Tôi nghi ngờ bạn không muốn --delete-excluded. Không có nó, chỉ *.jpg*.txtcó thể bị xóa ở phía đích. Với nó, các tập tin không liên quan cũng sẽ bị xóa. Bạn có thể quan tâm đến hướng dẫn này trên các bộ lọc rsync .
Gilles 'SO- ngừng trở nên xấu xa'

3
Cảm ơn! Đối với tôi, tôi đã bỏ lỡ dấu gạch chéo trên thư mục nguồn.
vaughan
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.