7

Я хочу передать N файлов из удаленной системы, используя шаблон:

ssh remote ls target/
2013-08-01.mjson.gz
2014-07-04.mjson.gz
2014-07-09.mjson.gz
2014-08-12.mjson.gz
...

Я хочу только файлы 2014-07* . Мои попытки пока:

rsync -a --dry-run --verbose --include="2014-07-*" remote:target .
# transfers everything

rsync -a --dry-run --verbose --include="2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --exclude="*" --include="2014-07-*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="*/2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="***/2014-07-*" --exclude="*" remote:target .
# transfers nothing

Я знаю, что могу использовать --files-from, чтобы указать, какие именно файлы мне нужны, но это сложно.

Я никогда не понимал, как правильно использовать include/exclude, чтобы делать то, что я хочу. Страница руководства гласит:

и действует первый соответствующий шаблон: если это шаблон исключения, то этот файл пропускается; если это шаблон включения, то это имя файла не пропускается; если соответствующий шаблон не найден, то имя файла не пропускается.

Читая это, я предположил, что если сначала было включено include, а имя файла совпало, то тогда включилась бы часть "имя файла не пропущено". Видимо, я не прав.

Ниже на странице руководства я вижу:

Обратите внимание, что при использовании параметра --recursive (-r) (что подразумевается под -a) каждый субкомпонент каждого пути посещается сверху вниз, поэтому шаблоны include/exclude рекурсивно применяются к полному имени каждого субкомпонента

Так как я использовал --recursive , сделал это причиной . быть пропущенным из-за глобального исключения?

Как передать подмножество файлов, используя шаблоны включения и исключения?

1 ответ1

8

Хотя вы можете использовать include и exclude, я думаю, что это было бы более простым решением:

rsync -a --dry-run --verbose remote:'target/2014-07*' .

Причина, по которой ваш вариант include/exclude не работает, заключается в том, что rsync никогда не спускается в target каталог, поскольку он исключен шаблоном * и не соответствует шаблону включения (который соответствует только файлам в target , но не самой target ). Чтобы включить / исключить для работы, вы должны сделать что-то вроде

rsync -a --dry-run --verbose --include=target --include='target/2014-07-*' --exclude='*' remote:target .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .