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-dirstù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/Dir1và/data/Dir2bao gồm nội dung của họ đến/media/MyDestination/Dir1và/media/MyDestination/Dir2? Hay bạn muốn bao gồm/datamộ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,--excludetuyên bố của bạn ngăn chặn sự đệ quy.