Eu criei a seguinte solução.
# exclude system created files like .DS_Store, desktop.ini...
arg="-C
"
# project each "$path" to "/$path/**" and concat 'em all
while read line || [[ -n $line ]]; do
arg+="+ /$line/**
"
done < $subdirs
# */ - includes each folder so that rsync traverses the whole tree,
# * - excludes everything else
arg+="+ */
- *"
# -m - excludes "empty" dirs that we used to traverse the tree
echo "$arg" | rsync -rmhvn -f ". -" --delete-excluded --info=PROGRESS2 --size-only $source/./ "$target"