A questão é que você fez as aspas duplas no nome do arquivo.
Use uma matriz para manter as opções em rsync .
Em um shell /bin/sh (também funcionaria em bash ):
# options that are always set
set -- --archive --verbose
# add --link-dest=DIR if needed
if [ -n "$LAST_SNAPSHOT" ]; then
set -- "$@" --link-dest="$BACKUP_ROOT/$LAST_SNAPSHOT"
fi
# add some --excludes
set -- "$@" --exclude='*.ext' --exclude='dir/***'
# call rsync
rsync "$@" "$MASTER/" "$NEW_SNAPSHOT"
Isso faz uso do único array disponível em um shell POSIX (a menos que estendido, como bash e outros), o array de parâmetros posicionais. Ao definir as entradas nessa matriz (usando set ) e adicioná-las conforme necessário, podemos ter certeza de manipular argumentos citados para rsync (ou qualquer comando) apropriadamente. Na chamada para rsync , usamos "$@" , o que garantirá que as entradas na matriz sejam individualmente citadas duplamente e, portanto, protegidas da divisão de palavras e geração de nome de arquivo pelo shell.
O equivalente, mas usando uma matriz bash :
# options that are always set
opts=( --archive --verbose )
# add --link-dest=DIR if needed
if [ -n "$LAST_SNAPSHOT" ]; then
opts+=( --link-dest="$BACKUP_ROOT/$LAST_SNAPSHOT" )
fi
# add some --excludes
opts+=( --exclude='*.ext' --exclude='dir/***' )
# call rsync
rsync "${opts[@]}" "$MASTER/" "$NEW_SNAPSHOT"