¿Cómo sobrescribir un enlace simbólico de un directorio?

15

Hay dos directorios foo1y foo2.

Al principio hago un enlace simbólico de directorio por ln -s foo1 bar. Después de eso quiero cambiar el enlace simbólico, así que escribíln -sf foo2 bar

Pero bartodavía está vinculado con foo1. El enlace simbólico foo2se crea dentro de foo1.

¿Qué debo escribir cuando quiero reemplazar foo1por foo2?

Probé en tres ambientes.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (GNU coreutils) 8.4
  3. OS X 10.7.5, ln (sin versión)
hierro y
fuente

Respuestas:

18

La forma correcta de hacer esto es usar la -n, --no-dereferenceopción de esta manera.

$ ln -snf foo2 bar

Esto hace lnque se trate el enlace simbólico existente como un archivo. De lo contrario, se elimina referencias bara foo1, desciende en foo1y utiliza el original TARGETnombre que el LINK_NAMEY es por eso que terminan con un enlace simbólico al foo2ser creado dentro del foo1directorio. La página de manual lnindica lo siguiente ...

-n, --no-dereference
       trate LINK_NAME como un archivo normal si es un enlace simbólico a un
       directorio

A continuación se muestra el resultado del shell en mi escritorio Arch Linux con la versión 8.21 de lncon y sin la --no-dereferenceopción, obtuve los mismos resultados que obtuviste sin la --no-dereferenceopción, pero usar la --no-dereferenceopción funcionó como se esperaba.

$ 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
fuente
Gracias por tu respuesta. Si es un problema que depende del entorno, escribiré mi entorno. ¿Qué sistema operativo estás usando? lo que da salida ln --version?
ironsand
Probé esto en una VM Fedora 18 con la versión 8.17. Curiosamente, probé esto en mi escritorio Arch Linux con la versión 8.21 y obtuve los mismos resultados que obtuviste. Parece que en algún lugar entre esas dos versiones algo cambió. Sin embargo, la solución que publiqué funcionó en ambos casos.
Drew Chapin
Para su información, encontré esta respuesta en los foros de justlinux.com .
Drew Chapin
Gracias druciferre! Incluso nunca pensé que el lncomando a menudo se actualiza.
ironsand
Probé en osx también. lnfunciona igual que ubuntu y centos con el directorio sobrescribir y ln -snfresolver el problema. Aunque ln -hes la opción preferida para usar en osx.
ironsand