
Digamos que tenemos una ruta en nuestro directorio como:
a/b/c/d/e
¿Dónde c
hay en realidad un enlace simbólico?
a/b/c -> f
Y f
contiene d/e
.
Luego, cuando ejecuto rsync -avzR
, sin la --copy-unsafe-links
bandera, 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-dirs
opció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 rsync
pá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