Preciso "instalar" um monte de arquivos em outro diretório, mantendo intacta a estrutura de diretórios dos arquivos de origem. Por exemplo, se eu ./foo/bar/baz.txt
indo para /var/www/localhost/webroot/
eu quero o resultado para ser /var/www/localhost/webroot/foo/bar/baz.txt
. rsync
possui essa capacidade --relative
, mas quando fiz isso, descobri que não era amigável criar links 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
Então você vê que o link simbólico não é mais um link simbólico - os arquivos foram copiados para o lugar errado!
rsync
também tem a --no-implied-dirs
opção, que superficialmente parece fazer o que eu quero, mas funciona apenas como pretendo quando não estou executando um rsync recursivo, então tenho que:
find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/
Existe alguma maneira mais direta de realizar esse espelhamento de arquivos sem apagar os diretórios intermediários de links simbólicos (com ou sem rsync)?