¿Cómo anular / actualizar un enlace simbólico?

188

Estoy tratando de usar enlaces simbólicos. Leí un poco y encontré los siguientes comandos:

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

Las creaciones y eliminaciones funcionan bien. Pero las actualizaciones no funcionan. Después de ejecutar este comando, el enlace simbólico deja de ser válido.

He leído aquí y allá que no es posible actualizar / anular un enlace simbólico. Por lo tanto, hay información contradictoria en la red. ¿Quién tiene la razón? Si un enlace simbólico se puede actualizar / anular, ¿cómo puedo lograrlo?

Actualizar

Aquí está mi estructura de directorios:

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

Desde ~/scripts/test/, cuando realizo:

ln -s /remote_loc/site1 test_link

una test_linkse crea, y puedo ls -l, pero que parece roto (al contrario de lo que he dicho anteriormente en mi pregunta).

¿Cómo puedo realizar un enlace de nivel de directorio múltiple?

Jérôme Verstrynge
fuente
1
Recomiendo usar en unlinklugar de rm. Con unlinkusted nunca corre el riesgo de perder ningún archivo en un directorio fuente al usar accidentalmente interruptores incorrectos.
Jpsy
Está utilizando un líder / en su comando
Jamie Cook
@jpsy su consejo sobre desvincular sería muy bueno, si fuera cierto . Intenta tocar zzzz; desvincular zzzz. (desvincular llamadas, desvincular igual que rm, pero sin opciones sofisticadas y sin recursividad).
ctrl-alt-delor
¿Por qué usar -n? (puede ser el problema) Además, si su ln es compatible, úselo -t, para estos casos, y / -To destination/para otros casos.
ctrl-alt-delor

Respuestas:

150

Usar -fcon lnsobrescribirá cualquier enlace que ya estaba allí, por lo que siempre que tenga los permisos correctos, debería funcionar ... Siempre me ha funcionado. Qué sistema operativo estás usando?

Sirch
fuente
He actualizado mi pregunta con más información sobre mi problema.
Jérôme Verstrynge
Estoy bajo linux.
Jérôme Verstrynge
2
Si cambia los lnparámetros, como soy propenso a hacer, ¿el -finterruptor destruirá sus archivos existentes (objetivos de enlace)? En cualquier caso, también tenemos el -iparámetro (que solicitará al usuario que se sobrescriba), si desea un poco de seguridad.
palswim
2
@palswim Esta publicación SO implica que es segura porque -fsolo llama unlink()y link()está oculto : stackoverflow.com/a/1466570/157385 . Sin embargo, ¡desearía recordar el orden correcto!
Mike Branski
44
No funciona. Necesidades -n. Ver respuesta aceptada.
Shawn Welch
119

Ok, encontré dónde está mi error: uno no debe poner el primero /en la ruta.

En otras palabras, los comandos en mis preguntas deberían ser:

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

en lugar de

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

considerando mi caso

Jérôme Verstrynge
fuente
22
Para obtener información adicional sobre por qué eso es así, las diferencias son una es una relativeruta (sin el / principal) y la otra es una absoluteruta (con el / principal). Si está administrando un sistema Linux, es CRÍTICO que comprenda las diferencias. Por ejemplo, la diferencia entre rm -rf ./*y rm -rf /.*decide si mantienes tu trabajo o no :)
Safado
55
Esto no responde a la pregunta 'cómo actualizar / anular un enlace sym'
Sirch
La línea ln -sfn {ruta / a / nombre-archivo} {nombre-enlace} sí.
Jérôme Verstrynge
66
-n (--no-dereference) hace que trate el {nombre del enlace} como un archivo normal en lugar de seguir el enlace. Dado que necesita operar en ese enlace y no seguirlo, debe usar esta opción.
feldoh
1
Esta respuesta debe ser resaltar la respuesta con el -nparámetro para reemplazar el enlace del símbolo.
Nick Tsai el
12

Primer problema:

Citandote:

Las creaciones y eliminaciones funcionan bien. Pero las actualizaciones no funcionan. Después de ejecutar este comando, el enlace simbólico deja de ser válido.

El problema con la estructura de directorios dada:

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

y usando el comando:

ln -s /remote_loc/site1 test_link

Es que crea un enlace simbólico en su $ PWD, o directorio de trabajo actual, que apunta a un archivo no existente fuera de /, o root, en / remote_loc / site1

Si su PWD está en ~ / scripts /, entonces debería haber usado esto:

ln -s remote_loc/site1 test_link

de lo contrario, podría haber utilizado la ruta absoluta completa como:

ln -s /home/yourusername/remote_loc/site1 test_link

Segundo problema:

Citandote:

He leído aquí y allá que no es posible actualizar / anular un enlace simbólico. Por lo tanto, hay información contradictoria en la red. ¿Quién tiene la razón? Si un enlace simbólico se puede actualizar / anular, ¿cómo puedo lograrlo?

Para responder a su pregunta "Quién tiene razón", no estoy seguro de qué es exactamente lo que leyó o cómo se entendió. Pero, lo siguiente debería ayudar a aclarar:

  1. Lo que se puede actualizar y
  2. Lo que no se puede actualizar sin usar los interruptores adecuados.


Actualización de enlaces simbólicos con objetivos que no son directorios.

ln -sf:
La fuerza -f o --force elimina los archivos de destino existentes. Esto se utiliza para actualizar el destino o el destino de un enlace.

Ejemplo:

 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

Pero, como puede ver, dará la ruta absoluta si las rutas absolutas están en lnlos argumentos. Es necesario dar una ruta completa cuando el directorio de trabajo actual es diferente del directorio principal del enlace.


Caminos relativos:

ln -sfr:
El relativo -r o --relativo crea enlaces simbólicos relativos a la ubicación del enlace.

Ejemplo:

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

Pero, actualizar un enlace a un directorio no funcionará si el destino es un directorio.

Ejemplo:

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 puede ver, a pesar de usar nombres de ruta absolutos dados en lnel argumento anterior sin la opción -r, el enlace simbólico sigue siendo relativo al enlace.


Actualizar enlaces a directorios:

ln -sfrn:
-n o --no-dereference trata a LINK_NAME como un archivo normal si es un enlace simbólico a un directorio.

Ejemplo:

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

En contraste con:

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
Keith Reynolds
fuente
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
jirib
fuente
Cuando realizo pruebas con 1 nivel de directorio, funciona, pero estoy tratando de usar directorios de varios niveles, y no funciona. He actualizado mi pregunta.
Jérôme Verstrynge