rsync com link simbólico no caminho

rsync com link simbólico no caminho

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 fcontém d/e.

Então, quando eu executo rsync -avzR, sem o --copy-unsafe-linkssinalizador, 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-dirsopçã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 rsyncpá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

informação relacionada