Các nhãn hiệu rsync cảnh báo về kịch bản này (phần “Bao gồm / loại trừ quy định mẫu”):
việc này sẽ không hiệu quả:
+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *
Điều này không thành công vì thư mục mẹ "some"
bị loại trừ bởi '*'
quy tắc, vì vậy rsync không bao giờ truy cập bất kỳ tệp nào trong thư mục "some"
hoặc "some/path"
thư mục. Một giải pháp là yêu cầu bao gồm tất cả các thư mục trong hệ thống phân cấp bằng cách sử dụng một quy tắc duy nhất: "+ */"
(đặt nó ở đâu đó trước "- *"
quy tắc) và có thể sử dụng --prune-empty-dirs
tùy chọn. Một giải pháp khác là thêm các quy tắc bao gồm cụ thể cho tất cả các thư mục mẹ cần được truy cập. Chẳng hạn, bộ quy tắc này hoạt động tốt:
+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *
Trong trường hợp của bạn, tôi nghĩ rằng cách tiếp cận đơn giản nhất sẽ được preprocess danh sách các thư mục bao gồm do đó bất cứ khi nào bạn bao gồm /path/to/foo
, bạn cũng bao gồm tất cả các thư mục mẹ ( /path/to
, /path
, /
), và cũng có thể bao gồm các thư mục con của thư mục gốc ( /path/to/foo/***
), và sau tất cả điều này có một quy tắc loại trừ mọi thứ không được liệt kê trước đây ( *
).
<DirectoriesToCopy.txt awk '
{print "+ " $0 "/***"; while (sub(/\/+[^\/]+\/*$/, "/")) print "+ " $0}
END {print "- *"}
' >rsync-rules.txt
rsync -avr --include-from=rsync-rules.txt / /media/MyDestination/
/data/Dir1
và/data/Dir2
bao gồm nội dung của họ đến/media/MyDestination/Dir1
và/media/MyDestination/Dir2
? Hay bạn muốn bao gồm/data
một phần? Danh sách này lớn đến mức nào, có quá lớn không khi chỉ liệt kê những mục đó trên dòng lệnh? Dù sao,--exclude
tuyên bố của bạn ngăn chặn sự đệ quy.