Sử dụng rsync để chỉ xóa các tệp không liên quan


13

Cách tốt nhất để so sánh hai cấu trúc thư mục và xóa các tệp và thư mục không liên quan trong vị trí đích là gì?

Tôi có một ứng dụng thư viện ảnh nhỏ mà tôi đang phát triển. Người dùng thêm và xóa hình ảnh bằng FTP. Phần mềm thư viện web tôi đã viết tạo ra các hình thu nhỏ mới một cách nhanh chóng, nhưng nó không xử lý việc xóa. Những gì tôi muốn làm là lên lịch cho một tập lệnh / bash để xử lý việc này theo các khoảng thời gian được xác định trước.

Hình ảnh gốc được lưu trữ trong /home/gallery/images/và được sắp xếp trong album, sử dụng các thư mục con. Các hình thu nhỏ được lưu trữ trong bộ đệm /home/gallery/thumbs/, sử dụng cùng cấu trúc thư mục và tên tệp như thư mục hình ảnh.

Tôi đã thử sử dụng những điều sau đây để đạt được điều này:

rsync  -r --delete --ignore-existing /home/gallery/images /home/gallery/thumbs

sẽ hoạt động tốt nếu tất cả các hình thu nhỏ đã được lưu vào bộ nhớ cache, nhưng không có gì đảm bảo rằng đây sẽ là trường hợp, khi điều này xảy ra, thư mục ngón tay cái có hình ảnh kích thước đầy đủ ban đầu được sao chép vào nó.

Làm thế nào tôi có thể đạt được tốt nhất những gì tôi đang cố gắng làm?

Câu trả lời:


8

Tôi không nghĩ rsynclà cách tiếp cận tốt nhất cho việc này. Tôi sẽ sử dụng bash one-liner như sau:

$ cd /home/gallery/thumbs && find . -type f | while read file;do if [ ! -f "../images/$file" ];then echo "$file";fi;done

Nếu lớp lót này tạo ra danh sách đúng các tệp, thì bạn có thể sửa đổi nó để chạy rmlệnh thay vì echolệnh.


Cảm ơn Tom. Tôi đoán để làm sạch các thư mục, tôi cần chạy lại lần thứ hai, nhưng chỉ định các thư mục trong các lệnh thay vì các tệp và thay thế tiếng vang bằng rmdir?
Bryan

@Bryan: Vâng nghe có vẻ hợp lý. Bạn cần thay đổi các cờ trong findvà trong [bài kiểm tra ]. Tất nhiên, xin hãy cẩn thận cả với lệnh tôi đã đưa cho bạn và mọi sửa đổi, và kiểm tra kỹ lưỡng với echo!
Tom Shaw

Rất cám ơn, tôi sẽ áp dụng số lượng lớn tiếng vang trong khi thử nghiệm.
Bryan

1
Chỉ cần có một suy nghĩ: bạn cũng có thể kiểm tra bằng "ls" để đảm bảo nó hoạt động tốt với khoảng trắng. Lời chúc tốt nhất.
Tom Shaw

34

Bạn --existingcũng cần :

rsync -r --delete --existing --ignore-existing /home/gallery/images /home/gallery/thumbs

Từ trang hướng dẫn:

  --existing, --ignore-non-existing
          This tells rsync to skip creating files (including  directories)
          that  do  not  exist  yet on the destination.  If this option is
          combined with the --ignore-existing option,  no  files  will  be
          updated  (which  can  be  useful if all you want to do is delete
          extraneous files).

1
Nếu có bất kỳ lỗi nào, câu trả lời tuyệt vời của bạn sẽ không hoạt động. Đó là lý do tại sao bạn cũng cần thêm --ignore-errorsđối số là tốt. Đó là điều duy nhất làm việc cho tôi. Cảm ơn bạn đã --existing--ignore-existing! Tôi đã sử dụng câu trả lời của bạn như là cơ sở của câu trả lời của tôi ở đây .
LonnieBest

@LonnieBest Nếu có lỗi, thậm chí rm, cphoặc mvsẽ không hoạt động vì đó là lỗi: Đó là những vấn đề cần được xem xét và ngăn các hoạt động hoàn thành thành công. Bạn có thể hướng dẫn hầu hết các công cụ để bỏ qua lỗi (ví dụ như -fcho rm) nhưng tôi không thấy làm thế nào mà có liên quan đến câu hỏi hoặc câu trả lời này.
Mecki
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.