Lệnh của bạn không hoạt động vì khi bạn đang sử dụng /var/www/*
làm nguồn, shell của bạn đang thực hiện toàn cầu trên nó, tức là shell đang mở rộng *
sang tất cả các tệp trong thư mục đó và sao chép từng tệp một, vì vậy ở đây các tệp riêng lẻ đã trở thành nguồn thay vì thư mục cha.
Vì vậy, nếu bạn sử dụng /var/www/*
, thì bạn không cần --recursive
tùy chọn vì *
sẽ khiến các tệp bị sao chép (cùng với bất kỳ thư mục nào có nội dung của chúng), chứ không phải thư mục mẹ có chứa các tệp. Vì lý do tương tự --delete
không hoạt động, vì --delete
sẽ xóa các tệp khỏi thư mục đích không có trong thư mục nguồn , nhưng bạn đang sao chép các tệp để nó không xóa các tệp (dự kiến).
Điều này sẽ làm cho bạn rõ ràng hơn:
/foo$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test
/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam
$ rsync -avz --ignore-existing --recursive --delete
/foo/* /bar/
+ rsync -avz --ignore-existing --recursive --delete
/foo/egg /foo/spam /foo/test /bar/
sending incremental file list
test/
test/hello
sent 173 bytes received 39 bytes 424.00 bytes/sec
total size is 0 speedup is 0.00
/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test
Như bạn có thể thấy, tôi đã sử dụng nguồn /foo/*
do đó rsync
lệnh được thực thi là
rsync -avz --ignore-existing --recursive --delete /foo/egg
/foo/spam /foo/test /bar/
với *
việc tạo shell để mở rộng nó và tạo tất cả các tệp riêng lẻ làm đối số nguồn, không phải toàn bộ thư mục mẹ (và bạn cũng không cần --recursive
trong trường hợp này).
Vì vậy, nếu bạn muốn thực hiện --delete
công việc, hãy chạy nó dưới dạng:
rsync -avz --ignore-existing --recursive --delete
/var/www/ root@mydomaintest.com:/var/www/