Подтвердить что ты не робот

Использование 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.

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

4b9b3361

Ответ 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" (его можно использовать для одиночных папок или файлов, но не для путей) и обратите внимание, что для имен файлов не работает более двух звездочек.