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"