Tùy chọn Rsync --delete không xóa các tệp trong thư mục đích


14

Tôi đang cố gắng sử dụng --deletetùy chọn rsyncđể xóa các tệp trong thư mục đích không có trong thư mục gốc

Đây là lệnh tôi đang sử dụng:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể xóa tất cả các tệp trong thư mục đích không có trong thư mục gốc?

Câu trả lời:


14

Sử dụng lệnh này:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Bạn không cần "*" và cũng không nên sử dụng nó.

Để loại trừ / bao gồm các tệp hoặc thư mục, bạn nên sử dụng tham số này:

--exclude 'to_exclude*'
--include 'to_include*'

Được rồi để tôi thử cái này :)
user2028856

2
Vì vậy, "*" đó có khiến lệnh --delete không hoạt động không?
dùng2028856

2
Đó là vẻ ngoài của nó. :)
AB

3
--recursivequá dư thừa vì tùy chọn -ađã bao gồm nó
Temak

1
"*" Có thể quan trọng trong một số trường hợp vì nó loại trừ các tệp / thư mục bắt đầu bằng ".". Ví dụ, tôi sử dụng nó khi sử dụng rsync để sao chép một thư mục được duy trì dưới git từ máy phát triển sang máy sản xuất. Tôi không muốn đồng bộ thư mục kho lưu trữ .git hoặc các tệp như .gitignore, chỉ là cây làm việc, bao gồm các tệp ở cấp cao nhất cũng như thư mục con.
sootsnoot

14

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 --recursivetù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ự --deletekhông hoạt động, vì --deletesẽ 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 đó rsynclệ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 --recursivetrong trường hợp này).

Vì vậy, nếu bạn muốn thực hiện --deletecô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/

4
Giải thích tuyệt vời chỉ ra vấn đề thực sự: sử dụng '*' để mở rộng danh sách nguồn.
Antonio Bardazzi

Như đã lưu ý trong nhận xét của tôi về câu trả lời được chấp nhận, * có thể hữu ích để loại trừ những thứ như tệp và thư mục bắt đầu bằng ".". Mặc dù như bạn lưu ý, điều này có nghĩa là các tệp và thư mục bị xóa khỏi cấp cao nhất trong nguồn sẽ không bị xóa khỏi thư mục đích. Đối với bản thân tôi, tôi không quan tâm liệu các tệp cấp cao nhất có bị xóa đúng cách khỏi đích hay không, chỉ các tệp bên dưới thư mục con mới quan trọng. Xóa một thư mục con cấp cao ít có khả năng hơn nhiều so với việc thêm một thư mục con và tôi sẵn sàng thực hiện rm thủ công -r về đích trong trường hợp không thể đó.
sootsnoot
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.