2012-03-31 6 views
32

У меня возникли проблемы с получением синтаксиса синтаксиса rsync, и мне интересно, можно ли на самом деле обработать сценарий с помощью rsync. Во-первых, я подтвердил, что rsync отлично работает между моим локальным хостом и моим удаленным хостом. Выполнение прямой синхронизации в каталоге выполняется успешно.Использование Rsync включает и исключает опции для включения каталога и файла по шаблону

Вот что моя файловая выглядит следующим образом:

uploads/ 
    1260000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1270000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 
    1280000000/ 
    file_11_00.jpg 
    file_11_01.jpg 
    file_12_00.jpg 

То, что я хочу сделать, это запустить Rsync только файлы, которые начинаются с «file_11_» в поддиректории, и я хочу, чтобы иметь возможность работать только один Rsync работу для синхронизации всех этих файлов в подкаталогах.

Вот команда, которую я пытаюсь:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

Это приводит в 0 файлов помечается для передачи в моем всухую. Я пробовал разные комбинации операторов --include и -exclude, но либо не получал никаких результатов, либо получил все, как если бы не были включены опции include или exclude.

У кого-нибудь есть идеи, как это сделать?

ответ

67

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

Я думаю, что ближе всего к тому, что вы хотите, это:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(который будет включать в себя все каталоги и все файлы, соответствующие file_11*.jpg, но никакие другие файлы) или возможно это:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(та же концепция, но гораздо разборчивее о каталогах он будет включать в себя).

+1

Спасибо! Это было именно то, что мне нужно. Мой сценарий был фактически более или менее тем, что вы описали в своем втором примере, но я сдержал мой вопрос, чтобы упростить этот вопрос. –

+0

@SheldonChang: Добро пожаловать! – ruakh

+5

Обратите внимание на важность (например,) '--include =" */"' в том числе ** родительских ** каталогов файлов, которые вы действительно хотите включить. – mabraham

7

Добавить -m в рекомендуемый ответ выше, чтобы обрезать пустые каталоги.

2

rsync включают исключить примеры шаблонов:

"*"   means everything 
"dir1"  transfers empty directory [dir1] 
"dir*"  transfers empty directories like: "dir1", "dir2", "dir3", etc... 
"file*"  transfers files whose names start with [file] 
"dir**"  transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc... 
"dir***" same as above 
"dir1/*" does nothing 
"dir1/**" does nothing 
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc... 

И последнее замечание, что просто Dont полагаться на звездочках, которые используются в начале для оценки путей; например "**dir" (его можно использовать для одиночных папок или файлов, но не для путей) и обратите внимание, что для имен файлов не работает более двух звездочек.

+0

Ваш ответ является единственным, который можно использовать, потому что вы объясняете общее поведение. Другие ответы слишком специфичны в соответствии с OP, но для каждой ситуации требуется другое решение! Это мне очень помогло! –

+0

@AlBundy Im рад! – TechJS

 Смежные вопросы

  • Нет связанных вопросов^_^