Làm cách nào để tạo rsync xóa các tệp đã bị xóa khỏi thư mục nguồn?


194

Gần đây tôi đã thiết lập một máy có Ubuntu Server để lưu trữ các máy chủ trò chơi. Tôi đã cài đặt một plugin sao lưu cho mỗi máy chủ trò chơi tạo bản sao lưu thường xuyên của các tệp trong thế giới trò chơi trong một thư mục cụ thể trên máy. Tôi cũng đã thiết lập một crontác vụ để tự động sao chép các bản sao lưu đó vào thư mục Dropbox của mình mỗi đêm bằng cách sử dụng rsync với -atùy chọn này.

Sau một vài tháng, tài khoản Dropbox của tôi đã đạt đến giới hạn lưu trữ và tôi nhận ra rằng tôi sẽ không thể giữ quá nhiều bản sao lưu, vì vậy tôi đã cấu hình plugin sao lưu máy chủ trò chơi để không giữ lại nhiều bản sao lưu, sau đó đợi vài ngày để xem liệu nó có hoạt động không xóa các bản sao lưu cũ hơn vì nó được lên kế hoạch thực hiện hàng tuần. Plugin sao lưu cuối cùng đã thực hiện công việc của mình và xóa các bản sao lưu cũ hơn, vì vậy tôi đã hy vọng rsynctác vụ cron sẽ xóa các bản sao lưu cũ hơn khỏi thư mục Dropbox của mình để khớp với thư mục nguồn, nhưng nó đã không được thực hiện. Vì vậy, tôi có một vài câu hỏi:

  • Theo mặc định, rsyncchỉ thêm các tệp vào thư mục đích đã được thêm vào thư mục nguồn và thay đổi các tệp đã được thay đổi trong thư mục nguồn nhưng KHÔNG xóa các tệp đã bị xóa khỏi thư mục nguồn?

  • Nếu đó là trường hợp, cách tốt nhất để làm rsyncđiều này là gì? Tôi muốn thư mục đích phản ánh hoàn hảo thư mục nguồn và điều đó có nghĩa là xóa mọi tệp đã bị xóa khỏi thư mục nguồn.

Tôi thấy một số tùy chọn được liệt kê trong trang hướng dẫn cho rsyncđiều đó có thể thực hiện mẹo, nhưng vì tôi không quen.

Câu trả lời:


227

Để xóa các tệp trong mục tiêu, thêm --deletetùy chọn vào lệnh của bạn. Ví dụ:

rsync -avh source/ dest/ --delete

15
Hãy chắc chắn rằng nguồn là một thư mục. Sử dụng source/* dest/sẽ không làm việc.
Tom Saleeba

3
Tôi thấy sự kiện đó có --deletehoặc --delete-afternó sẽ không xóa vì một số lỗi: "Đã gặp lỗi IO - bỏ qua việc xóa tệp". Để giải quyết --ignore-errorstùy chọn thêm này và gỡ lỗi các lỗi riêng biệt
MHT

12
Hoạt động hoàn hảo! Mặc dù nó đang hoạt động, tôi khuyên bạn nên LUÔN sử dụng -n, --dry-runtùy chọn, trước khi chạy rsync, đặc biệt khi nói đến các tùy chọn như thế này ( --delete). Nó sẽ tránh mọi đau đầu có thể :).
ivanleoncz

2
@MHT: Không có câu trả lời nào có vẻ hoàn chỉnh nếu không có bình luận của bạn.
Lonnie hay nhất

2
@TheBicent YearsMan -a ngụ ý -r .
x-yuri

45

Lệnh rsync sẽ không xóa bất kỳ tệp nào trong khi bạn sử dụng một số tùy chọn của nó deletetrong lệnh đó. Vì vậy, nếu bất kỳ tệp hoặc thư mục nào được thêm vào nguồn, nó sẽ được đồng bộ hóa để nhắm mục tiêu mà không cần xóa.

Tôi khuyên bạn nên sử dụng rsyncđể tạo bản sao lưu từ các tệp nguồn và sử dụng find ... rmđể xóa các tệp trong khoảng thời gian hoặc kích thước của các tệp:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

Khối mã ở trên, tạo bản sao lưu từ nguồn và sau đó xóa mọi tệp có thời gian sửa đổi lần cuối là hơn 2 tháng.

CẬP NHẬT

Vì tôi thấy rằng các deletetùy chọn chỉ dành cho TARGET mà nếu một số tệp bị xóa khỏi nguồn, hãy rsync --deletexóa chúng khỏi TARGET. Và deletetùy chọn bởi afterbefore, như được đề cập trong trang man của nó:

--delete-before         receiver deletes before transfer, not during

Có nghĩa là:

  1. rsync xóa tệp khỏi TARGET đã bị xóa khỏi SOURCE.
  2. rsync bắt đầu đồng bộ hóa tập tin.

--delete-after receiver deletes after transfer, not during

Có nghĩa là:

  1. rsync bắt đầu đồng bộ hóa tập tin.
  2. rsync xóa tệp khỏi TARGET đã bị xóa khỏi SOURCE sau khi đồng bộ hóa.

LƯU Ý : việc --delete-{before/after}thực hiện chỉ trong MỤC TIÊU.


1
Cảm ơn vi đa trả lơi!! Bạn đang đề cập đến một tùy chọn "xóa" cho rsync? Tại sao tôi không thể sử dụng tùy chọn "xóa" cho rsync?
dùng254251

@ user254251, Nếu bạn sử dụng xóa, lệnh rsync sẽ xóa ngay các tệp. Nhưng trong trường hợp này có nhiều thời gian hơn cho bất kỳ lỗi nào.
shgnInc

Nếu tôi hiểu chính xác, bạn đang nói rằng tôi nên tách tác vụ xóa khỏi tác vụ rsync để tránh lỗi. Tôi có một câu hỏi mặc dù. Trang thủ công cho rsync liệt kê một số tùy chọn xuất hiện để phục vụ mục đích phân tách tác vụ xóa bằng cách chạy nó trước hoặc sau tác vụ sao chép. Ví dụ: tôi thấy hai tùy chọn được gọi là --delete-before và --delete-after. Liệu rsync với các tùy chọn này có cùng tác dụng với phương pháp bạn mô tả không? Tôi đọc mô tả đầy đủ của từng tùy chọn trên trang hướng dẫn nhưng có một số thông tin trong các mô tả mà tôi không hiểu.
dùng254251

@ user254251, Trả lời đã được cập nhật. Tôi không biết có cách nào để xóa các tệp khỏi TARGET theo giới hạn thời gian trong rsync không .
shgnInc

Cảm ơn! Vì vậy, bạn có nghĩ rằng tôi an toàn trước các lỗi nếu tôi chỉ đơn giản sử dụng tùy chọn --delete-before? Tôi không chỉ định thời gian chờ vì vậy tôi không phải lo lắng nếu giai đoạn xóa rsync làm chậm giai đoạn chuyển. rsync chạy một lần mỗi ngày và đó là nhiều thời gian để đồng bộ hóa các tệp sao lưu trước khi đồng bộ hóa tiếp theo, vì vậy tôi cũng không cần phải giới hạn thời gian đồng bộ hóa.
dùng254251

6

Lệnh này sẽ sao chép dữ liệu gia tăng và giữ nó đồng bộ với máy chủ từ xa.

  1. Nó sẽ chỉ sao chép dữ liệu gia tăng.
  2. Nó sẽ xóa nếu bất kỳ dữ liệu bị xóa khỏi nguồn.
  3. Nó sẽ sao chép lại từ nguồn nếu bất kỳ dữ liệu nào bị xóa tại đích.
  4. về cơ bản lệnh này sẽ giữ cho cả hai môi trường đồng bộ.

rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)

Thí dụ:

rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup

2
Tôi nghĩ -W làm cho nó không chỉ sao chép dữ liệu gia tăng mà luôn sao chép toàn bộ tệp.
Tulains Córdova

Tôi đã gặp lỗi này bằng cách thực hiện lệnh này: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Nếu có bất kỳ sai sót trong một cuộc scync rsync, rsync sẽ không xóa đúng file nó cần phải có, ngay cả khi bạn sử dụng --delete, --delete-afterhoặc --delete-before.

Đây là lý do tại sao điều quan trọng là giải quyết các lỗi rsync.

Hầu hết các lỗi của tôi là do sử dụng --permstùy chọn trong khi đồng bộ hóa với hệ thống tệp Không phải Linux. Khi tôi thay thế --permsvới --no-perms, những lỗi ra đi và sau đó xóa làm việc.

--permsBạn đồng bộ hóa từ hệ thống tệp Linux sang hệ thống tệp Linux khác, nhưng nếu bạn đồng bộ hóa từ Linux sang hệ thống tệp Không phải Linux (như NTFS, FAT), --permssẽ gây ra lỗi vì rsync không thể đặt quyền cho Linux trên hệ thống tập tin không phải linux . Một lần nữa, lỗi = không xóa.

- Khi đồng bộ với một phân vùng Non-Linux, tôi sử dụng --no-permsđể tránh những lỗi mà phá hoại --delete, --delete-afterhoặc --delete-before.

Nếu sau đó bạn vẫn gặp lỗi và không thể tìm ra cách khắc phục các lỗi đó, bạn có thể chạy một lệnh dành riêng để xóa các tệp không đồng bộ:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

Lệnh trên sẽ xóa những thứ không đồng bộ hóa, nhưng sẽ không đồng bộ hóa bất kỳ tệp nào. Vì vậy, bạn nên đồng bộ lại sau này. Lệnh đó dựa trên câu trả lời này , ngoại trừ việc tôi cũng đã thêm --ignore-errorsđối số, vì vậy nó sẽ xóa ngay cả khi có lỗi.


1
Cảm ơn vì tiền hỗ trợ! Tôi là tác giả ban đầu của câu hỏi này 5 năm trước. Tôi thực sự rất vui vì bạn đã đăng bài này, vì tôi đã lên kế hoạch thiết lập đồng bộ hóa với ổ đĩa NTFS trong tương lai gần và có lẽ tôi đã gặp phải lỗi quyền vì tôi đang dự định sử dụng tùy chọn "-a" cho rsync, đồng bộ hóa quyền (trong số những thứ khác). Vì vậy, tôi đã thêm "--no-perms" vào ghi chú của mình. Bây giờ tôi có kế hoạch sử dụng rsync -a --no-perms --delete-trước. Tôi có một câu hỏi: Sẽ không - xóa - trước khi tránh các vấn đề với việc xóa tệp bằng cách chạy xóa trước khi đồng bộ hóa? Nghĩ rằng đó là mục đích của nó.
dùng254251

@ user254251 - Tôi không chắc chắn. Tôi đoán nó sẽ phụ thuộc vào việc nó thực sự "xóa trước" như thế nào. Nếu đó là một số cách gặp phải một lỗi trước khi bắt đầu xóa, thì bạn đã bị lừa. Lời khuyên của tôi cho bạn là tránh NTFS bất cứ lúc nào bạn có thể trừ khi bạn thích những cơn đau nhói ở mông :). NTFS đến NTFS hoạt động tốt. NTFS để Linix hoạt động tốt. Tránh "Hệ thống tệp Linux" thành "Hệ thống tệp không phải Linux"; đó là quá nhiều đau đớn để đảm bảo xóa công việc đúng. Bạn CÓ THỂ thực hiện điều này, nhưng tôi đã quyết định rằng nó không đáng để gặp rắc rối so với việc chỉ định dạng ổ đĩa đích là EXT4.
Lonnie tốt nhất
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.