Я думаю, что --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".
Вы можете найти несколько хороших примеров в разделе « Правила включения / исключения шаблонов» на странице руководства.