Necesito "instalar" un montón de archivos en otro directorio manteniendo intacta la estructura de directorios de los archivos fuente. Por ejemplo, si tengo que ./foo/bar/baz.txt
ir /var/www/localhost/webroot/
, quiero que sea el resultado /var/www/localhost/webroot/foo/bar/baz.txt
. rsync
tiene esta capacidad --relative
, pero cuando hice esto descubrí que no era amigable con los enlaces simbólicos:
$ ls -ald /var/www/localhost/webroot/ | grep ^l
lrwxrwxrwx 1 www-data www-data 15 2014-01-03 13:45 media -> ../static/media
lrwxrwxrwx 1 root root 13 2014-02-24 13:47 var -> ../static/var
$ rsync -qrR . /var/www/localhost/webroot/
$ ls -ald /var/www/localhost/webroot/ | grep var
drwxr-xr-x 3 root root 4096 2014-02-24 13:52 /var/www/localhost/webroot/var
Como puede ver, el enlace simbólico ya no es un enlace simbólico: ¡los archivos se copiaron en el lugar equivocado!
rsync
también tiene la --no-implied-dirs
opción, que superficialmente parece hacer lo que quiero, pero solo funciona como lo pretendo cuando no estoy haciendo un rsync recursivo, así que tengo que:
find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/
¿Hay alguna forma más directa de lograr esta duplicación de archivos sin eliminar directorios intermedios de enlaces simbólicos (con o sin rsync)?