First issue:
Quoting you:
Creations and deletions work fine. But updates do not work. After
performing this command, the symlink becomes invalid.
The problem With the given directory structure:
~/scripts/test/ ~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt
and using the command:
ln -s /remote_loc/site1 test_link
Is that it creates a symbolic link in your $PWD, or present working directory, that points to a non-existing file off the /, or root, at /remote_loc/site1
If your PWD is in ~/scripts/ then you should have used this:
ln -s remote_loc/site1 test_link
else you could have used the full absolute path like:
ln -s /home/yourusername/remote_loc/site1 test_link
Second issue:
Quoting you:
I have read here and there that it is not possible to update/override
a symlink. So there is contradictory information on the net. Who is
right? If a symlink can be updated/overridden, how can I achieve this?
To answering your question "Who is right", I am not sure what exactly you read, or how it was understood. But, the following should help clear up:
- What can be updated, and
- What can not be updated without using
appropriate switches.
Updating symbolic links with targets that are not directories.
ln -sf:
The -f or --force remove existing destination files, This is used to update a link's target or destination.
Example:
ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
-rw-r--r-- 1 0 Jun 8 17:19 test
lrwxrwxrwx 1 9 Jun 8 17:27 test.link -> /tmp/test
But, as you can see, it will give the absolute path if absolute paths are in ln
's arguments. Giving a full path is necessary when the present working directory is different than the link's parent directory.
Relative Paths:
ln -sfr:
The -r or --relative creates symbolic links relative to the link's location.
Example:
ln -sfr /tmp/test /tmp/test.link ; ls -go /tmp| grep test
-rw-r--r-- 1 0 Jun 8 17:19 test
lrwxrwxrwx 1 4 Jun 8 17:27 test.link -> test
But, updating a link to a directory will not work if the target is a directory.
Example:
ln -sf /tmp/testdir /tmp/testdir.link ; ls -go /tmp |grep testdir
drwxr-xr-x 2 4096 Jun 8 17:48 testdir
lrwxrwxrwx 1 7 Jun 8 17:47 testdir.link -> testdir
As you can see, despite using absolute path names given in ln
's argument above without the -r option, the symbolic link is still relative to the link.
Update Links to Directories:
ln -sfrn:
The -n or --no-dereference treats LINK_NAME as a normal file if it is a symbolic link to a directory.
Example:
ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun 8 17:48 testdir
lrwxrwxrwx 1 12 Jun 8 17:48 testdir.link -> /tmp/testdir
As contrasted with:
ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun 8 17:48 testdir
lrwxrwxrwx 1 7 Jun 8 17:48 testdir.link -> testdir