46

I'm using

ln -f -s /var/www/html/releases/build1390 app-current

to update symbolic link "app-current" with a new destination. However, this doesn't work, the link "app-current" keeps it original destination, however, I don't get any errors...

I'd rather not remove the link and recreate it, just update the target of an existing link. Is that possible?

solsol
  • 1,121
  • 8
  • 21
  • 31

2 Answers2

58

That works for me, what is the output of strace ln -f -s /var/www/html/releases/build1390 app-current ?

Oh, since it is a directory you need to add -n for no dereference and this should solve the issue. -f is really more of a convenience since adding the -f just causes it to unlink anyways. Although I guess it would probably happen a few hundred ms faster on a normally loaded system.

For example, if arf already points to /home:

strace With -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Without -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

So without the -n arf gets dereferenced so ln treats it as arf as if it were actually /. In your particular example, if there is no error, I think you have probably created a new symbolic link inside of /var/www/html/releases/build1390 app-current and will want to clean that up.

Kyle Brandt
  • 82,107
  • 71
  • 302
  • 444
15

You can use -n or --no-dereference to prevent the target from being dereferenced if it is a symlink. You can also use -T or --no-target-directory to ensure that the target file will always be treated as a regular file.

These produce slightly different behavior, as the following example shows. Suppose src is some file, dirlink is a symlink to a directory, and dir is an actual directory.

Using -n:

  • ln -sfn src dirlink overwrites dirlink and links it to src
  • ln -sfn src dir creates link dir/src -> src

Using -T:

  • ln -sfT src dirlink overwrites dirlink and links it to src
  • ln -sfT src dir produces an error message: ln: ‘dir’: cannot overwrite directory
augurar
  • 267
  • 2
  • 12
  • 2
    has the most correct and succinct answer for Linux users. – ross Jul 19 '13 at 01:15
  • Is there any way to force overwriting the target directory so you won't get the error message `cannot overwrite directory`? – gitaarik Aug 15 '13 at 11:05
  • @rednaw You can do this by chaining a couple of commands, but `ln` itself does not remove directories – this would probably be a bad idea, because it would require recursively removing a possibly huge number of files. – augurar Dec 07 '13 at 22:44