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 latest
copia 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-links
algunos trucos de inclusión/exclusión para seleccionar solo las /*/*/latest
ramas (además -m
de 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-links
el comportamiento con los latest
enlaces 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 /backups
es 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 -R
bandera 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, /backups
se ha omitido el componente). Hay muchos más detalles en la documentación ( man rsync
).