Come copiare la struttura delle directory senza rimuovere i collegamenti simbolici?


27

Devo "installare" un gruppo di file in un'altra directory mantenendo intatta la struttura delle directory dei file di origine. Ad esempio, se devo ./foo/bar/baz.txtandare /var/www/localhost/webroot/voglio che il risultato sia /var/www/localhost/webroot/foo/bar/baz.txt. rsyncha questa capacità --relative, ma quando l'ho fatto ho scoperto che non era facile usare i link simbolici:

$ 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

Quindi vedi che il collegamento simbolico non è più un collegamento simbolico: i file sono stati copiati nel posto sbagliato!

rsyncha anche l' --no-implied-dirsopzione, che superficialmente sembra fare quello che voglio, ma funziona solo come intendo quando non faccio una risorsiva ricorsiva, quindi devo:

find . -type f -print0 | xargs -0I{} rsync -R --no-implied-dirs {} /var/www/localhost/webroot/

Esiste un modo più diretto per realizzare questo mirroring dei file senza cancellare le directory intermedie symlink (con o senza rsync)?

Risposte:


42

Usa l rsync'opzione -K( --keep-dirlinks). Dalla manpage:

 -K, --keep-dirlinks
      This  option  causes  the  receiving side  to  treat  a
      symlink  to  a  directory  as though  it  were  a  real
      directory, but only if it matches a real directory from
      the  sender.   Without   this  option,  the  receiver’s
      symlink  would  be deleted  and  replaced  with a  real
      directory.

      For example, suppose you  transfer a directory foo that
      contains a file file, but foo is a symlink to directory
      bar  on  the  receiver.  Without  --keep-dirlinks,  the
      receiver  deletes  symlink  foo,   recreates  it  as  a
      directory,  and   receives  the   file  into   the  new
      directory.   With --keep-dirlinks,  the receiver  keeps
      the symlink and file ends up in bar.

      One note  of caution:  if you  use --keep-dirlinks, you
      must  trust all  the symlinks  in the  copy!  If  it is
      possible  for an  untrusted  user to  create their  own
      symlink to  any directory,  the user  could then  (on a
      subsequent  copy)  replace  the  symlink  with  a  real
      directory and affect the  content of whatever directory
      the  symlink references.   For backup  copies, you  are
      better off using something like a bind mount instead of
      a symlink to modify your receiving hierarchy.

      See also  --copy-dirlinks for  an analogous  option for
      the sending side.

16

Volevo preservare i miei collegamenti simbolici come collegamenti simbolici. Per questo puoi usare l'opzione -l.

    -l, --links                 copy symlinks as symlinks

Da quando stavo copiando i framework su OS X, l'ho trovato utile.


3

Si prega di utilizzare -a, come implica -lcome si suppone sopra. Ma contiene anche altre opzioni importanti se si desidera una copia completa della fonte.

Inoltre: come ho capito la pagina man, -Kè pensato per i collegamenti simbolici sul lato destinatario. Non penso che questa dovrebbe essere la risposta corretta qui.


2

Come mancata rsyncrisposta, l' tarutilità può eseguire questa attività. Utilizzare due istanze tarsu entrambi i lati di una pipe, la prima per utilizzare una struttura di directory e la seconda per estrarla altrove. La proprietà del file della copia cambierà probabilmente, mentre le modalità di autorizzazione rimarranno probabilmente invariate.

Esistono molti esempi e ho trovato i suggerimenti in questa risposta relativamente rapidamente: /unix//a/59108/34251 .

Modifica
Un secondo esempio (più succinto?): Https://unix.stackexchange.com/a/19824/34251 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.