Copie el enlace simbólico Y dónde apunta a usar rsync

11

No es necesario que lo haga rsync, pero sería bueno no tener que escribir un guión para hacer esto, y rsyncestá muy cerca de lo que quiero.

rsync -a(o -l) puede preservar los enlaces simbólicos, y -Lpuede desreferenciar los enlaces simbólicos y copiarlos como si fuera un archivo / directorio normal. Sin embargo, ¿es posible mantener el enlace simbólico y también copiar los archivos / directorios a los que apuntan los enlaces?

Aquí hay un ejemplo. Digamos que tenemos esta jerarquía de carpetas:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

y cuando lo hago rsync -aR dirA dest(o algo más), me gustaría que aparezcan exactamente estos en dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

¿Es esto posible con rsync? Gracias.

Supongamos que se pueden ignorar los enlaces simbólicos que tienen una ruta absoluta o que apuntan fuera del directorio de origen.

Wei-Yin
fuente
1
Creo que su solicitud no está especificada: requiere que si se dirA/linktrata de un enlace simbólico a ../dirB/file, entonces esto debe manejarse como copiando dirB/filea dest/dirB/filey dirA/linkhacia dest/dirA/link. ¿Qué pasa si dirA/linkhay un enlace ../../another_file? ¿Qué sucede, en general, si dirA/linkapunta a un directorio que está más arriba en el árbol de directorios?
Riccardo Murri
Buena atrapada. En mi caso de uso, no hay un punto de enlace fuera del árbol, y no hay una ruta absoluta en los enlaces.
Wei-Yin
1
Cuanto más lo pienso, más creo que ninguna utilidad estándar hará esto. En el caso general, puede ser que necesite para crear un gran número de destinos dados una sola fuente, si usted tiene un enlace a un enlace simbólico o más generalmente un enlace simbólico cuyo objetivo contiene un enlace simbólico (por ejemplo a -> b, b -> c/foo, c -> d/e: una petición de copia atambién debe copiar b` c` c/foo` d` d/ey d/e/foo).
Gilles 'SO- deja de ser malvado'
@Gilles: Sí, tienes razón. El seguimiento de los enlaces podría conducir a la inclusión de muchos archivos, siempre y cuando todavía estén dentro del directorio de origen.
Wei-Yin

Respuestas:

2

Si conoce el nombre del enlace simbólico y desea transferir el enlace y el destino , puede:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

Las primeras rsynctransferencias solo el symlink. El segundo comando encuentra el nombre real del directorio y el segundo rsynctransfiere el contenido del directorio.

usuario201564
fuente
0

Esto sería posible si y solo si estos estuvieran todos en 'mydir' y estuvieran en rsync 'mydir' de un lugar a otro. Rsync no es capaz de copiar fuera de la ruta que le das (con la excepción de los siguientes enlaces). p.ej

mydir/dirA ...
mydir/dirB ...
...
xenoterracida
fuente
Sí, esta suposición se ajusta a mi caso de uso. Todos los enlaces están dentro de mydir.
Wei-Yin
@ Wei-Yin simplemente le digo que no siga los enlaces simbólicos ... o he entendido mal algo
xenoterracide
@xenoterracide: No importa cómo invoque a rsync, creo que creará un único destino para cada fuente (que no sea la creación de directorios principales). Pero Wei-Yin quiere crear dos o más destinos: el enlace y su objetivo.
Gilles 'SO- deja de ser malvado'
aparentemente estoy confundido ...
xenoterracide
@Gilles: no es necesario que rsync siga el enlace simbólico, ya que sincronizará el objetivo de todos modos . Por lo tanto, primero copia el enlace simbólico, creando un enlace simbólico colgante. Luego continúa para copiar todo lo demás en el directorio, incluido el destino del enlace simbólico. Voila, todo encaja muy bien.
Martin v. Löwis