Руководство rsync предупреждает об этом сценарии (раздел «Включить / исключить правила шаблона»):
это не сработает:
+ /some/path/this-file-will-not-be-found
+ /file-is-included
- *
Это терпит неудачу, потому что родительский каталог "some"исключен '*'правилом, поэтому rsync никогда не посещает какие-либо файлы в каталогах "some"или "some/path". Одно из решений состоит в том, чтобы запросить включение всех каталогов в иерархии, используя одно правило: "+ */"(поместите его где-нибудь перед "- *"правилом) и, возможно, используйте --prune-empty-dirsопцию. Другое решение заключается в добавлении определенных правил включения для всех родительских каталогов, которые необходимо посетить. Например, этот набор правил работает нормально:
+ /some/
+ /some/path/
+ /some/path/this-file-is-found
+ /file-also-included
- *
В вашем случае, я думаю , самый простой подход был бы препроцессировать список каталогов , которые включают в себя так , что всякий раз , когда вы включаете /path/to/foo, вы также включают в себя все родительские каталоги ( /path/to, /path, /), а также включать подкаталоги исходных каталогов ( /path/to/foo/***), и после того, как на все это есть правило, исключающее все, что ранее не перечислялось ( *).
<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и/data/Dir2включить их содержимое в/media/MyDestination/Dir1и/media/MyDestination/Dir2? Или вы хотите включить/dataчасть? Насколько велик этот список, он слишком велик, чтобы просто перечислять эти записи в командной строке? Во всяком случае, ваши--excludeзаявления не позволяют рекурсии.