rsync com symlink no caminho [closed]

1

Digamos que tenhamos um caminho em nosso diretório, como:

a/b/c/d/e

onde c é realmente um link simbólico,

a/b/c -> f

E f contém d/e .

Então, quando eu executar rsync -avzR , sem o sinal --copy-unsafe-links , 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?

    
por OneRaynyDay 01.06.2018 / 19:37

2 respostas

1

Por man rsync (minha ênfase):

-R, --relative

Use relative paths. This means that the full path names specified on the command line are sent to the server rather than just the last parts of the filenames. [If] you used

rsync -avR /foo/bar/baz.c remote:/tmp/

then a file named /tmp/foo/bar/baz.c would be created on the remote machine, preserving its full path. These extra path elements are called "implied directories" (i.e. the "foo" and the "foo/bar" directories in the above example).

Beginning with rsync 3.0.0, rsync always sends these implied directories as real directories in the file list, even if a path element is really a symlink on the sending side. This prevents some really unexpected behaviors when copying the full path of a file that you didn’t realize had a symlink in its path. If you want to duplicate a server-side symlink, include both the sym‐ link via its path, and referent directory via its real path. If you’re dealing with an older rsync on the sending side, you may need to use the --no-implied-dirs option.

Assim, o comportamento que você experimentou é esperado.

Como superar isso? Eu não testei isso, mas acho que uma solução viável seria ao longo das linhas:

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'

Também recomendo a leitura da seção LINKS SÍMBOLOS da página rsync man.

    
por 01.06.2018 / 20:09
0

Eu não posso replicar seu comportamento. Eu criei um script que configura um diretório e copia-o. Tem um link simbólico relativo e absoluto dentro. Com as opções que você mostra ( -avzR ), ele não deve descer em nenhuma delas, mas copiar o link como um link.

Eu presumo que interpretei mal algum aspecto do que você está tentando. Então você pode adicionar à sua pergunta se você encontrar o que é, ou você pode executar este script e ver se o seu comportamento é diferente do que eu mostro.

Script:

#!/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
    
por 02.06.2018 / 05:59

Tags