¿Copiar solo enlaces simbólicos específicos con rsync?

¿Copiar solo enlaces simbólicos específicos con rsync?

Tengo una estructura de carpetas que quiero copiar usando rsync, en la cual la estructura es una serie de copias de seguridad de las cuales solo quiero copiar la última (que se puede identificar usando un enlace simbólico), así:

/backups
    /foo
        /2019-05-01
        /2019-06-01
        /latest -> 2019-06-01
    /bar
        /2019-05-20
        /2019-06-20
        /latest -> 2019-06-20

Etcétera; lo que me gustaría hacer es, usando un solo comando rsync, copiarsolola latestcopia de seguridad de cada carpeta, mientras que por lo demás imita la estructura. Para ello se me ocurrió el siguiente comando:

rsync -rptgoDLm --include '*/' --include '/*/latest/**' --exclude '*' user@remote:/backups /some/local/path

Básicamente, un archivo con --copy-linksalgunos trucos de inclusión/exclusión para seleccionar solo las /*/*/latestramas (además -mde evitar un montón de estructuras de directorios vacías). Esto funciona bien excepto por un problema; Si alguna de estas ramas contiene enlaces simbólicos, estos también se copian como destinos, en lugar de simplemente enlaces simbólicos.

Lo que realmente necesito poder hacer essolouse --copy-linksel comportamiento con los latestenlaces simbólicos, mientras usa otro comportamiento (por ejemplo, el de --links) para cualquier otro que se encuentre.

¿Es posible tal cosa con un solo comando rsync? Mi objetivo es poder ejecutar esto sin tener que saber cuál /backupses el contenido inmediato, de modo que si agrego algo nuevo (por ejemplo, /backups/baz) se copiará automáticamente.

Actualizar: Para aclarar, la estructura de directorio resultante que me gustaría ver en el destino sería:

/backups
    /foo
        /latest
    /bar
        /latest

es decir, solo necesito la última versión de cada copia de seguridad en el destino (el destino mismo manejará el historial de copias de seguridad de otra manera).

Respuesta1

Esto parece ajustarse a sus requisitos.

rsync -avR user@remote:'/backups/*/latest/' /some/local/path/

La -Rbandera efectivamente "copia" toda la ruta de origen en el destino y las copias de seguridad resultantes aparecerán como /some/local/path/backups/{whatever}/latest.

Si descubre que no desea la ruta de origen completa, puede incluirla /./para indicar el punto desde el cual se debe copiar la ruta hasta el destino. Por ejemplo, /backups/./foo/latest/daría como resultado /some/local/path/foo/latest/(es decir, /backupsse ha omitido el componente). Hay muchos más detalles en la documentación ( man rsync).

información relacionada