Мне нужно «установить» кучу файлов в другой каталог, сохраняя структуру каталогов исходных файлов. Например, если я ./foo/bar/baz.txt
собираюсь, /var/www/localhost/webroot/
я хочу, чтобы результат был /var/www/localhost/webroot/foo/bar/baz.txt
. rsync
имеет эту возможность --relative
, но когда я сделал это, я обнаружил, что он не дружит с символическими ссылками:
$ 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
Таким образом, вы видите, что символическая ссылка больше не является символической ссылкой - файлы были скопированы в неправильное место!
rsync
также есть --no-implied-dirs
опция, которая внешне, кажется, делает то, что я хочу, но она работает только так, как я собираюсь, когда не делаю рекурсивный rsync, поэтому я должен:
find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/
Есть ли какой-либо более прямой способ выполнить такое зеркалирование файлов без удаления промежуточных каталогов символических ссылок (с или без rsync)?