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


Estoy tratando de usar enlaces simbólicos. Hice una lectura 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. Así que hay información contradictoria en la red. Quien tiene razon Si un enlace simbólico puede actualizarse / anularse, ¿cómo puedo lograrlo?

Actualizar

Aquí está mi estructura de directorio:

~/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_link se crea, y puedo ls -l eso, pero parece roto (al contrario de lo que dije anteriormente en mi pregunta).

¿Cómo puedo realizar un enlace de múltiples directorios?


150
2018-05-17 12:39


origen


Recomiendo usar unlink en lugar de rm. Con unlink nunca se arriesga a perder ningún archivo en un directorio de origen utilizando accidentalmente interruptores incorrectos. - Jpsy
Usted está utilizando un líder / en su comando - Jamie Cook
@jpsy tu consejo sobre desvincular sería muy bueno, si fuera cierto. Intenta tocar zzzz; desvincular zzzz. (desvincular llamadas, desvincularse igual que rm, pero sin opciones sofisticadas y sin recursión). - ctrl-alt-delor
¿Por qué el uso de -n? (puede ser el problema). También si su ln apoya -t luego usarlo, para estos casos, y -T o destination/ para otros casos. - ctrl-alt-delor


Respuestas:


Utilizando -f con ln sobrescribirá cualquier enlace que ya estuviera allí, así que mientras tenga los permisos correctos, debería funcionar ... Siempre me ha funcionado. Qué sistema operativo estás usando?


124
2018-05-17 12:49



He actualizado mi pregunta con más información sobre mi problema. - Jérôme Verstrynge
Estoy bajo linux. - Jérôme Verstrynge
Si cambia el ln parámetros, como soy propenso a hacer, será el -f ¿Destruye el interruptor de tus archivos existentes (objetivos de enlace)? En cualquier caso, tenemos la -i parámetro (que solicitará al usuario que sobrescriba) también, si desea un poco de seguridad. - palswim
@palswim Este mensaje SO implica que es seguro porque -f solo llamadas unlink() y link() bajo el capó: stackoverflow.com/a/1466570/157385. Sin embargo, me gustaría recordar el orden correcto! - Mike Branski
No funciona. Necesariamente -n. Ver respuesta aceptada. - Shawn Welch


Ok, encontré donde está mi error: uno no debe poner el primero / en camino

En otras palabras, los comandos en mis preguntas deben 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


91
2018-05-17 13:32



Para obtener información adicional sobre por qué, las diferencias son una es una relative camino (sin el líder /) y el otro es un absolute camino (con el líder /). Si está administrando un sistema Linux, es CRÍTICO que entienda las diferencias. Por ejemplo, la diferencia entre rm -rf ./* y rm -rf /.* decide si mantienes tu trabajo o no :) - Safado
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í lo hace. - Jérôme Verstrynge
Que diferencia hace -n opción hacer? - dokaspar
-n (--no-dereference) hace que se trate a {nombre del enlace} como un archivo normal en lugar de seguir el enlace. Dado que necesitas operar en ese enlace no seguirlo debes usar esta opción. - feldoh


Primer problema:

Citando a usted:

Las creaciones y eliminaciones funcionan bien. Pero las actualizaciones no funcionan. Después   ejecutando este comando, el enlace simbólico se vuelve invá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 raíz, 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 usado la ruta absoluta completa como:

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

Segundo problema:

Citando a usted:

He leído aquí y allá que no es posible actualizar / anular   un enlace simbólico. Así que hay información contradictoria en la red. Quien es   ¿Correcto? Si un enlace simbólico puede actualizarse / anularse, ¿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. Qué se puede actualizar, y
  2. Lo que no se puede actualizar sin usar. interruptores apropiados.


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

ln -sf:
  El comando -f o --force elimina los archivos de destino existentes. Esto se usa para actualizar el destino o 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 de. Es necesario dar una ruta completa cuando el directorio de trabajo actual es diferente al directorio principal del enlace.


Caminos relativos:

ln -sfr:
  La -r o - relativa 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

Sin embargo, la actualización de 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:
  La -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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



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