1

on server1: /dir1 is a symlink to dir2

on server2: /dir1 is a directory with its own content

I want to use rsync to make server2:/dir1 be a symlink to dir2, just as it is on server1.

If I do this on server1:

rsync -azvs --delete /dir1 user@server2:/dir1

then I actually get a new (broken) symlink on server2:

/dir1/dir1 -> dir2

(so it's copying the symlink into the existing /dir1 directory instead of replacing it)

Can I instead get rsync to trample the existing /dir1 directory with the symlink?

Edit: I thought the above command would work because of this comment in the man for rsync under the --copy-dirlinks section:

Without this option, if the sending side has replaced a directory with a symlink to a directory, the receiving side will delete anything that is in the way of the new symlink, including a directory hierarchy (as long as --force or --delete is in effect).

However, the behavior appears the same with and without --force, and with and without -k.

dlo
  • 451
  • 1
  • 4
  • 14

2 Answers2

1

The problem is that you are specifying /dir1 as the destination. You need to go up one level.

rsync -azvs --delete /dir1 user@server2:/
njahnke
  • 290
  • 3
  • 15
  • Be sure not to append a final `/` to your source path, or you will be very sad. – njahnke Jul 05 '18 at 03:29
  • Crap. I don't even need to test this to know I'm an idiot. Thanks. And your warning made me chuckle... I'd be sad indeed. – dlo Jul 05 '18 at 21:37
0

I don't understand why you would use Rsync to make a symlink in the same server. Maybe I'm misunderstanding your question, but if you want to make a symlink inside server2 with source in /dir2 and link in /dir1, you should simply run: ln -s /dir2 /dir1.

Just in case, as stated in the other answer and extending the issue with your line.

Deconstructing your command:

rsync -azvs --delete /dir1 user@server2:/dir1

You are doing an rsync, archive mode (recursive, owner, group, include symlinks as symlinks, among others) , compressing, verbose and no space-splitting:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    -z, --compress              compress file data during the transfer
    -v, --verbose               increase verbosity
    -s, --protect-args          no space-splitting; wildcard chars only

Also, you are deleting your destination differences:

        --delete                delete extraneous files from dest dirs

Then you are using as origin /dir1, which means the whole directory, not just the contents (because there is no trailing slash "/").

And the destination is user@server2:/dir1, considering /dir1 was a symlink and you were using the -a flag for archive, you are copying the symlink inside the root /dir1, ending with this:

server2:/dir1/dir1
Leo
  • 1,833
  • 8
  • 17
  • Sorry the explanation was a bit confusing. See the accepted answer to see what a dummy I was. – dlo Jul 05 '18 at 21:38