rsync sẽ không xóa các tập tin về đích


22

Tôi đang cố gắng phản chiếu một thư mục thay đổi theo thời gian sang thư mục khác. Vấn đề của tôi là rsync không xóa các tệp ở đích nếu chúng không còn tồn tại trong thư mục nguồn nữa. Đây là một kịch bản demo:

#!/bin/sh

set -x

DIR1=/tmp/1
DIR2=/tmp/2

rm -rf $DIR1
rm -rf $DIR2

mkdir $DIR1
mkdir $DIR2

echo "foo" > $DIR1/a
echo "bar" > $DIR1/b

rsync -a $DIR1/* $DIR2

rm -f $DIR1/a

rsync -a --delete $DIR1/* $DIR2

ls -1 $DIR2

Đây là đầu ra:

+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b

Như bạn có thể thấy, tệp "a" vẫn hiện diện trong thư mục đích sau khi rsync chạy lần thứ hai, đây không phải là thứ tôi cần. Tôi có đang lạm dụng tùy chọn '--delete' không?


Coi chừng / * ở cuối thư mục nguồn. Điều đó sẽ khiến rsync chỉ xem xét các tệp đó chứ không phải chính thư mục (và sự vắng mặt của các tệp không còn tồn tại).
Walt Stoneburner

Câu trả lời:


9

Lý do là bởi vì bạn đang gọi rsync trên / tmp / 1 / b, điều này sẽ không xem xét tập tin / tmp / 1 / a.

Ý định của bạn dường như là rsync thư mục / tmp / 1 / - nếu bạn sử dụng "/ tmp / 1 /" làm nguồn chứ không phải các tệp riêng lẻ, nó sẽ nhận thấy rằng "a" đã bị xóa khỏi thư mục và xóa nó từ mục tiêu.


23

Loại bỏ *. Như đã đề cập trong trang man rsync, --deletetùy chọn không hoạt động với các mục ký tự đại diện.

Sử dụng cái này thay thế:

rsync -a --delete $DIR1/ $DIR2/

"--Delete này cho rsync để xóa các tập tin không liên quan từ phía nhận (những người mà không phải là ở phía bên gửi), nhưng chỉ cho các thư mục đang được đồng bộ. Bạn phải có rsync yêu cầu gửi toàn bộ thư mục (ví dụ dirhoặ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/*) do ký tự đại diện được mở rộng bởi trình bao và rsync 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 chuyển cũng bị loại trừ khỏi đã bị xóa trừ khi bạn sử dụng --delete-excludedtùy chọn 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 QUY TẮC LỌC). "


Đây là chức năng giống như câu trả lời của Sven từ năm 2011.
Rowan Hawkins

8

Nếu bạn thay đổi dòng rsync thứ hai thành rsync -a --delete $DIR1/ $DIR2(không có *) thì nó sẽ hoạt động. Lý do là shell mở rộng *tên tệp trong thư mục đầu tiên, chỉ có b trong trường hợp của bạn, vì vậy tệp bị thiếu sẽ không được xem xét bởi rsync, vì thực tế lệnh được thực thi rsync -a --delete $DIR1/b $DIR2.

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.