rsync con enlace simbólico en la ruta

rsync con enlace simbólico en la ruta

Digamos que tenemos una ruta en nuestro directorio como:

a/b/c/d/e

¿Dónde chay en realidad un enlace simbólico?

a/b/c -> f

Y fcontiene d/e.

Luego, cuando ejecuto rsync -avzR, sin la --copy-unsafe-linksbandera, seguirá copiando este enlace "inseguro".

Esperado:

a/b/c->f
f/d/e

cuando corro rsync -avzR a/b/c/d/e some_dir.

Salida real:

a/b/c/d/e

¿Cómo puedo obtener el resultado esperado de esta manera?

Respuesta1

Porman rsync(énfasis mío):

-R, --relativo

Utilice rutas relativas. Esto significa que los nombres de ruta completos especificados en la línea de comando se envían al servidor en lugar de solo las últimas partes de los nombres de archivo. [Si] usaste

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

luego se crearía un archivo llamado /tmp/foo/bar/baz.c en la máquina remota, conservando su ruta completa. Estos elementos de ruta adicionales se denominan"directorios implícitos"(es decir, los directorios "foo" y "foo/bar" en el ejemplo anterior).

A partir de rsync 3.0.0,rsync siempre envía estos directorios implícitos como directorios reales en la lista de archivos, incluso si un elemento de ruta es realmente un enlace simbólico en el lado emisor. Esto evita algunos comportamientos realmente inesperados al copiar la ruta completa de un archivo que no sabía que tenía un enlace simbólico en su ruta. Si desea duplicar un enlace simbólico del lado del servidor, incluya tanto el enlace simbólico a través de su ruta como el directorio de referencia a través de su ruta real. Si está tratando con un rsync antiguo en el lado emisor, es posible que necesite usar la --no-implied-dirsopción.

Entonces, se espera el comportamiento que experimentó.

¿Cómo superar esto? No he probado esto, pero creo que una solución viable sería la siguiente:

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'

También recomendaría leer elENLACES SIMBÓLICOSsección de la rsyncpágina de manual.

Respuesta2

No puedo replicar tu comportamiento. Creé un script que configura un directorio y luego lo copia. Tiene un enlace simbólico relativo y absoluto en su interior. Con las opciones que muestras ( -avzR), no debería descender a ninguna de las dos, sino copiar el enlace como enlace.

Supongo que he malinterpretado algún aspecto de lo que estás intentando. Entonces puede agregar a su pregunta si encuentra qué es eso, o puede ejecutar este script y ver si su comportamiento es diferente al que muestro.

Guion:

#!/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

Producción

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

Y el destino se crea con los enlaces 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

información relacionada