Como sobrescrever / atualizar um symlink?

155

Estou tentando usar links simbólicos. Eu fiz algumas leituras e encontrei os seguintes comandos:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Criações e exclusões funcionam bem. Mas as atualizações não funcionam. Depois de executar este comando, o link simbólico se torna inválido.

Eu li aqui e ali que não é possível atualizar / substituir um link simbólico. Portanto, há informações contraditórias na rede. Quem está certo? Se um symlink puder ser atualizado / substituído, como posso conseguir isso?

Atualizar

Aqui está a minha estrutura de diretórios:

~/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

De ~/scripts/test/ , quando eu executo:

ln -s /remote_loc/site1 test_link

um test_link é criado, e eu posso ls -l , mas parece estar quebrado (ao contrário do que eu disse acima na minha pergunta).

Como posso executar um link no nível de vários diretórios?

    
por Jérôme Verstrynge 17.05.2012 / 14:39

4 respostas

96

Ok, descobri onde está o meu erro: não se deve colocar o primeiro / no caminho.

Em outras palavras, os comandos nas minhas perguntas devem ser:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

em vez de

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

considerando meu caso.

    
por 17.05.2012 / 15:32
125

Usar -f com ln sobrescreverá qualquer link que já existia, portanto, desde que você tenha as permissões corretas, ele deve funcionar ... Sempre funcionou para mim. Qual sistema operacional você está usando?

    
por 17.05.2012 / 14:49
10

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:

  1. O que pode ser atualizado e
  2. 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
    
por 09.06.2016 / 00:58
6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
    
por 17.05.2012 / 14:42