Руководство 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
заявления не позволяют рекурсии.