Primeira edição:
Citando você:
Creations and deletions work fine. But updates do not work. After
performing this command, the symlink becomes invalid.
O problema Com a estrutura de diretórios fornecida:
~/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
e usando o comando:
ln -s /remote_loc/site1 test_link
É que ele cria um link simbólico em seu diretório de trabalho $ PWD, ou presente, que aponta para um arquivo não existente fora de /, ou raiz, em / remote_loc / site1
Se o seu PWD está em ~ / scripts / então você deveria ter usado isto:
ln -s remote_loc/site1 test_link
senão você poderia ter usado o caminho absoluto completo como:
ln -s /home/yourusername/remote_loc/site1 test_link
Segunda edição:
Citando você:
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?
Para responder à sua pergunta "Quem está certo", não sei exatamente o que você leu ou como foi entendido. Mas o seguinte deve ajudar a esclarecer:
- O que pode ser atualizado e
- O que não pode ser atualizado sem usar
comutadores apropriados.
Atualizando links simbólicos com destinos que não são diretórios.
ln -sf:
The -f or --force remove existing destination files, This is used to update a link's target or destination.
Exemplo:
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
Mas, como você pode ver, ele dará o caminho absoluto se os caminhos absolutos estiverem nos argumentos de ln
. Dar um caminho completo é necessário quando o diretório de trabalho atual é diferente do diretório pai do link.
Caminhos relativos:
ln -sfr:
The -r or --relative creates symbolic links relative to the link's location.
Exemplo:
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
Mas, atualizar um link para um diretório não funcionará se o destino for um diretório.
Exemplo:
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
Como você pode ver, apesar de usar nomes de caminho absolutos dados no argumento ln
acima sem a opção -r, o link simbólico ainda é relativo ao link.
Atualizar links para diretórios:
ln -sfrn:
The -n or --no-dereference treats LINK_NAME as a normal file if it is a symbolic link to a directory.
Exemplo:
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
Em contraste com:
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