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)

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.