45

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?

2 Answers 2

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.

0
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
3
  • 2
    has the most correct and succinct answer for Linux users.
    – ross
    Jul 19, 2013 at 1: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, 2013 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 7, 2013 at 22:44

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .