How to copy directory structure without removing symlinks?
Use rsync
's option -K
(--keep-dirlinks
). From the 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.
I wanted to preserve my symlinks as symlinks. For that you can use the -l option.
-l, --links copy symlinks as symlinks
Since I was copying frameworks on OS X, I found this helpful.
Please use -a
, as it implies -l
as was supposed above. But it also contains other important options if you want a complete copy of the source.
Also: As I understand the man page, -K
is meant for symlinks on the receiver side. I don't think this should be the correct answer here.