Использование 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.
Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Проблема заключается в том, что --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/
(такая же концепция, но много пикеров о каталогах, которые она будет включать).
Ответ 2
Добавьте -m в рекомендуемый ответ выше, чтобы обрезать пустые каталоги.
Ответ 3
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...
И последнее замечание заключается в том, что просто не полагайтесь на звездочки, которые используются в начале для оценки путей; например "**dir"
(его можно использовать для одиночных папок или файлов, но не для путей) и обратите внимание, что для имен файлов не работает более двух звездочек.