it-swarm-vi.com

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

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?

51
Cheng

Lý do lệnh của bạn không hoạt động được giải thích bởi trang thủ công 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 phát sinh bên 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 là do Shell và rsync mở rộng, do đó nhận được 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 được 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ừ xóa hoặc đánh dấu các quy tắc là chỉ khớp ở 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ẫu. Các --delete-excluded tùy chọn đảm bảo rằng các tệp thậm chí bị loại trừ ở phía DEST sẽ bị xóa.

73
Steven D