0
cp -r src/* dest/

If src/ & dest/ both contain a directory foo, the contents of src/foo/ are copied into dest/foo/, which is desired.

If dest/ instead contains a symlink foo -> /sym/foo to a directory elsewhere, the command errors:

cp: cannot overwrite non-directory 'dest/foo' with directory 'src/foo'

Is it possible to copy following the target symlink, with GNU cp? As far as I can tell it only has an option (-L/--dereference) for following source symlinks.

2
  • I assume that the target of foo really is a directory?
    – roaima
    Dec 6, 2019 at 23:02
  • Yes, I've edited the question to be clearer about that.
    – OJFord
    Dec 8, 2019 at 13:34

1 Answer 1

1

You can achieve this behaviour with rsync's --keep-dirlinks option:

From man rsync (1):

-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".

Example:

rsync -av --keep-dirlinks src/ dest
1
  • Thanks, I anticipated rsync would probably do it; I was hoping to solve it neatly (more so than present for loop) without installing it. (So I won't accept this answer because I did say "with GNU cp", but thanks, and I'm sure it will be helpful to others.)
    – OJFord
    Dec 8, 2019 at 13:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.