Muszę „zainstalować” kilka plików do innego katalogu, zachowując nienaruszoną strukturę katalogów plików źródłowych. Na przykład, jeśli mam ./foo/bar/baz.txt
zamiar /var/www/localhost/webroot/
Chcę być wynikiem /var/www/localhost/webroot/foo/bar/baz.txt
. rsync
ma taką możliwość --relative
, ale kiedy to zrobiłem, odkryłem, że nie jest przyjazne tworzenie dowiązań symbolicznych:
$ 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
Widzisz więc, że dowiązanie symboliczne nie jest już dowiązaniem symbolicznym - pliki zostały skopiowane w niewłaściwe miejsce!
rsync
ma również --no-implied-dirs
opcję, która powierzchownie wydaje się robić to, co chcę, ale działa tylko tak, jak zamierzam, gdy nie wykonuję rekurencyjnego rsync, więc muszę:
find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/
Czy istnieje bardziej bezpośredni sposób na wykonanie kopii lustrzanej plików bez usuwania pośrednich katalogów dowiązań symbolicznych (z lub bez rsync)?