Использование Rsync включает и исключает опции для включения каталога и файла по шаблону - PullRequest
57 голосов
/ 31 марта 2012

У меня проблемы с правильным синтаксисом 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.

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

Ответы [ 3 ]

100 голосов
/ 31 марта 2012

Проблема в том, что --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/

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

18 голосов
/ 28 декабря 2017

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

8 голосов
/ 25 января 2017

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

...