Я думаю, что --include
используется для включения подмножества файлов, которые в противном случае исключаются --exclude
, а не для включения только этих файлов. Другими словами: вы должны думать о включении значения , а не об исключении .
Вместо этого попробуйте:
rsync -zarv --include "*/" --exclude="*" --include="*.sh" "$from" "$to"
Для версии rsync 3.0.6 или выше порядок необходимо изменить следующим образом (см. Комментарии):
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
Добавление -m
флага позволит избежать создания пустых структур каталогов в месте назначения. Проверено в версии 3.1.2.
Поэтому, если нам нужны только файлы * .sh, мы должны исключить все файлы --exclude="*"
, включить все каталоги --include="*/"
и включить все файлы * .sh --include="*.sh"
.
Вы можете найти несколько хороших примеров в разделе « Правила включения / исключения шаблонов» на странице руководства.