
Digamos que temos um caminho em nosso diretório como:
a/b/c/d/e
onde c
é na verdade um link simbólico,
a/b/c -> f
E f
contém d/e
.
Então, quando eu executo rsync -avzR
, sem o --copy-unsafe-links
sinalizador, ele ainda copiará esse link "inseguro".
Esperado:
a/b/c->f
f/d/e
quando eu corro rsync -avzR a/b/c/d/e some_dir
.
Saída real:
a/b/c/d/e
Como posso obter o resultado esperado dessa maneira?
Responder1
Porman rsync
(minha ênfase):
-R, --relativo
Use caminhos relativos. Isso significa que os nomes completos dos caminhos especificados na linha de comando são enviados ao servidor, em vez de apenas as últimas partes dos nomes dos arquivos. [Se] você usou
rsync -avR /foo/bar/baz.c remote:/tmp/
então um arquivo chamado /tmp/foo/bar/baz.c seria criado na máquina remota, preservando seu caminho completo. Esses elementos extras do caminho são chamados"diretórios implícitos"(ou seja, os diretórios "foo" e "foo/bar" no exemplo acima).
Começando com rsync 3.0.0,O rsync sempre envia esses diretórios implícitos como diretórios reais na lista de arquivos, mesmo que um elemento do caminho seja realmente um link simbólico no lado do envio. Isso evita alguns comportamentos realmente inesperados ao copiar o caminho completo de um arquivo que você não percebeu que tinha um link simbólico em seu caminho. Se você deseja duplicar um link simbólico do lado do servidor, inclua o link simbólico por meio de seu caminho e o diretório de referência por meio de seu caminho real. Se você estiver lidando com um rsync mais antigo no lado do envio, talvez seja necessário usar a
--no-implied-dirs
opção.
Portanto, o comportamento que você experimentou é esperado.
Como superar isso? Eu não testei isso, mas acho que uma solução alternativa viável seria a seguinte:
mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir # No trailing slash after 'f'
Eu também recomendaria a leitura doLINKS SIMBÓLICOSseção da rsync
página de manual.
Responder2
Não consigo replicar seu comportamento. Criei um script que configura um diretório e depois o copia. Possui um link simbólico relativo e um absoluto dentro dele. Com as opções que você mostra ( -avzR
), não deve descer para nenhuma delas, mas sim copiar o link como um link.
Presumo que interpretei mal algum aspecto do que você está tentando. Portanto, você pode adicionar algo à sua pergunta se descobrir o que é, ou pode executar este script e ver se o seu comportamento é diferente do que mostro.
Roteiro:
#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST
Saída
sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f
E o destino é criado com os links simbólicos dentro
$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f