how to update a symbolic link target (ln -f -s not working)

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.


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