Como eu escrevo uma exclusão rsync para uma árvore de diretórios com nomes contendo espaços?

2

Estou tentando excluir uma árvore de diretórios como parte de um comando rsync incorporado em um script bash aproximadamente assim:

$OPTIONS="-rl --exclude 'Some Parent Directory/Another Directory'"

rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir

Meu objetivo é sincronizar todos os $SOURCEDIR em /SomeTargetDir na máquina de destino, com exceção de tudo em Some Parent Directory/Another Directory . No entanto, continuo vendo erros deste formulário:

rsync: link_stat "/Users/myusername/Parent\" failed: No such file or directory (2)

Suponho que isso esteja relacionado a escapar do caminho de exclusão, mas parece que não consigo acertar: toda combinação de \ , \ e assim por diante que eu tento não parece correta. Como posso escrever a regra de exclusão corretamente?

Eu não quero usar --exclude-from a menos que seja absolutamente necessário.

Estou usando o rsync versão 3.0.9 no OS X 10.8, sincronizando com o Ubuntu 12.04 em SSH.

    
por Andrew Ferrier 13.04.2013 / 13:38

2 respostas

1

Exclua padrões de correspondências também. Então tente assim:

$OPTIONS="-rl --exclude '*/Another Directory'"
rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir

Veja este tutorial para obter mais detalhes.

EDIT # 1

Outra sugestão seria tentar escapar de aspas duplas em vez de usar aspas simples:

$OPTIONS="-rl --exclude \"Some Parent\ Directory/Another\ Directory\""

O OP tentou essa alternativa, mas ainda não funcionou para ele no caso dele. Ele funciona para mim no Linux usando a versão "3.0.8 protocol version 30" de rsync .

    
por 13.04.2013 / 15:02
1

Use --exclude-from . O arquivo de exclusão terá todos os padrões em uma nova linha, e você poderá esquecer citações, problemas de escape e espaço.

Eu tenho um script parecido com o seu, e é isso que eu fiz. Observe que, com essa solução, estou gerando o arquivo de exclusão no meu script, portanto, ainda preciso garantir que as citações estejam corretas. Se você puder ter um arquivo de exclusão estática, isso será ainda mais simples.

# create a temporary file
RSYNC_EXCLUDES=$( mktemp -t rsync-excludes )
# remove the temp file when the script exits
trap "rm -f $RSYNC_EXCLUDES" EXIT
# populate the exclusion file
echo 'Some Parent Directory/Another Directory' > "$RSYNC_EXCLUDES"
# have your options point to your exclusion file
$OPTIONS="-rl --exclude-from='$RSYNC_EXCLUDES'"
# profit
rsync $OPTIONS $SOURCEDIR [email protected]:/SomeTargetDir
    
por 20.11.2014 / 02:26