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
overwritesdirlink
and links it tosrc
-
ln -sfn src dir
creates linkdir/src -> src
Using -T
:
-
ln -sfT src dirlink
overwritesdirlink
and links it tosrc
-
ln -sfT src dir
produces an error message:ln: ‘dir’: cannot overwrite directory