Como sobrescrever um link simbólico de um diretório?

15

Existem dois diretórios foo1e foo2.

No começo, faço um link simbólico de diretório ln -s foo1 bar. Depois disso, quero alterar o link simbólico, então digiteiln -sf foo2 bar

Mas barainda está ligado foo1. O link simbólico foo2é criado dentro de foo1.

O que devo escrever quando eu quiser substituir foo1por foo2?

Eu testei em três ambientes.

  1. Ubuntu 12.04, ln (núcleo GNU) 8.13
  2. CentOS 6.4, ln (núcleo GNU) 8.4
  3. OS X 10.7.5, ln (sem versão)
ferros e areias
fonte

Respostas:

17

A maneira correta de fazer isso é usar a -n, --no-dereferenceopção assim.

$ ln -snf foo2 bar

Isso faz lncom que o link simbólico existente seja tratado como um arquivo. Caso contrário, ele dereferences barpara foo1, desce em foo1e usa o original TARGETnome como o LINK_NAMEE é por isso que você acabar com um link simbólico para foo2ser criado dentro do foo1diretório. A página de manual lndeclara o seguinte ...

-n, - sem desreferencia
       trate LINK_NAME como um arquivo normal se for um link simbólico para um
       diretório

Abaixo está a saída do shell no meu desktop Arch Linux com a versão 8.21 de lncom e sem a --no-dereferenceopção, obtive os mesmos resultados que você obteve sem a --no-dereferenceopção, mas usando a --no-dereferenceopção funcionou conforme o esperado.

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
Drew Chapin
fonte
Obrigado pela sua resposta. Se for um problema dependente do ambiente, escreverei meu ambiente. Qual sistema operacional você está usando? quais saídas ln --version?
ironsand
Eu tentei isso em uma VM Fedora 18 com a versão 8.17. Curiosamente, eu tentei isso no meu desktop Arch Linux com a versão 8.21 e obtive os mesmos resultados que você. Parece que em algum lugar entre essas duas versões algo mudou. A solução que publiquei funcionou em ambos os casos.
Drew Chapin
Para sua informação, encontrei esta resposta nos fóruns justlinux.com .
Desenhou Chapin
Obrigado druciferre! Eu nunca pensei que o lncomando fosse atualizado com tanta frequência.
ironsand
Eu testei no osx também. lnfunciona da mesma forma que o ubuntu e o centos com o diretório sobrescrito e ln -snfresolve o problema. Mesmo que ln -hseja preferir opção para usar no osx.
precisa