Wie kopiere ich die Verzeichnisstruktur ohne Symlinks zu entfernen?

27

Ich muss eine Reihe von Dateien in einem anderen Verzeichnis "installieren", wobei die Verzeichnisstruktur der Quelldateien intakt bleibt. Wenn ich zum Beispiel ./foo/bar/baz.txtgehe, /var/www/localhost/webroot/möchte ich das Ergebnis haben /var/www/localhost/webroot/foo/bar/baz.txt. rsynchat diese Fähigkeit in --relative, aber als ich das tat, stellte ich fest, dass es nicht freundlich zu Symlinks war:

$ 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

Sie sehen also, dass der Symlink kein Symlink mehr ist - die Dateien wurden an die falsche Stelle kopiert!

rsynchat auch die --no-implied-dirsMöglichkeit, das scheint oberflächlich zu tun , was ich will, aber es funktioniert nur , wie ich beabsichtige , wenn nicht eine rekursive rsync tun, also muss ich:

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

Gibt es eine direktere Möglichkeit, diese Spiegelung von Dateien durchzuführen, ohne zwischengeschaltete Symlink-Verzeichnisse zu löschen (mit oder ohne rsync)?

Kojiro
quelle

Antworten:

42

Benutze rsyncdie Option -K( --keep-dirlinks). Aus der 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.
angus
quelle
16

Ich wollte meine Symlinks als Symlinks erhalten. Dazu können Sie die Option -l verwenden.

    -l, --links                 copy symlinks as symlinks

Da ich Frameworks unter OS X kopierte, fand ich dies hilfreich.

Ben Flynn
quelle
3

Bitte verwenden Sie -a, wie es -loben vermutet wurde. Es enthält aber auch andere wichtige Optionen, wenn Sie eine vollständige Kopie der Quelle wünschen.

Außerdem: Soweit ich weiß, ist die Manpage -Kfür Symlinks auf der Empfängerseite gedacht. Ich denke nicht, dass dies hier die richtige Antwort sein sollte.

Christian Gut
quelle
2

Als nicht rsyncbeantwortete Frage kann das tarDienstprogramm diese Aufgabe ausführen. Verwenden Sie zwei Instanzen von tarauf beiden Seiten einer Pipe, die erste, um eine Verzeichnisstruktur zu belegen, und die zweite, um sie an einer anderen Stelle zu extrahieren. Der Dateibesitz der Kopie wird sich wahrscheinlich ändern, während die Berechtigungsmodi wahrscheinlich unverändert bleiben.

Es gibt viele Beispiele und ich fand die Vorschläge in dieser Antwort relativ schnell: https://unix.stackexchange.com/a/59108/34251 .

Bearbeiten Sie
ein zweites (prägnanteres?) Beispiel: https://unix.stackexchange.com/a/19824/34251 .

crw
quelle