simbolico remover permiten para link fuertes enlaces enlace eliminar directorios directorio carpeta unix symlink

unix - remover - no se permiten enlaces fuertes para directorios



¿Hay alguna manera de editar un enlace simbólico sin eliminarlo primero? (10)

Esta pregunta ya tiene una respuesta aquí:

Así que creé un enlace simbólico:

ln -s /location/to/link linkname

Ahora quiero cambiar la ubicación a la que se vincula el enlace simbólico. ¿Cómo puedo hacer eso? ¿Hay alguna manera de hacerlo sin eliminarlo primero?


Como han mencionado otros, básicamente debe eliminar el enlace simbólico primero, ya sea manualmente o pasando el indicador -f a la utilidad ln .

Hace años, tuve que hacer pequeñas ediciones de enlaces simbólicos con bastante frecuencia, así que escribí una utilidad sencilla basada en edln ( edln ) para hacer esto menos molesto. En caso de que alguien más lo encuentre útil, lo he puesto en línea en https://github.com/jjlin/edln/ .

edln mostrará el objetivo de enlace simbólico original; a continuación, puede usar las teclas de flecha, o las teclas de lectura estándar ( Mb , Mf , Cd , etc.) para moverse y editar el objetivo.


En OSX, la página man para ln dice que puedes hacerlo así

ln -shf /location/to/link link name

Desde la página man:

The options are as follows:

-F If the target file already exists and is a directory, then remove it so that the link may occur. The -F option should be used with either -f or -i options. If none is specified, -f is implied. The -F option is a no-op unless -s option is specified. -h If the target_file or target_dir is a symbolic link, do not follow it. This is most useful with the -f option, to replace a symlink which may point to a directory. -f If the target file already exists, then unlink it so that the link may occur. (The -f option overrides any previous -i options.) -i Cause ln to write a prompt to standard error if the target file exists. If the response from the standard input begins with the character `y'' or `Y'', then unlink the target file so that the link may occur. Other- wise, do not attempt the link. (The -i option overrides any previous -f options.) -n Same as -h, for compatibility with other ln implementations. -s Create a symbolic link. -v Cause ln to be verbose, showing files as they are processed.


Encadena los comandos de esta manera:

rm currentlink && ln -s /path/to/link currentlink

El primer comando elimina el existente y el segundo inmediatamente lo crea de nuevo.


No. La llamada al sistema de symlink devolverá EEXIST si newpath ya existe. Solo puede vincular desde un nuevo nodo en el sistema de archivos. ¿Cuál es el requisito aquí? Si está preocupado por una carrera debido a la falta de atomicidad de las llamadas desvinculación / enlace simbólico, entonces es posible que desee volver a pensar la arquitectura un poco para proporcionar la sincronización en otro lugar. Ha habido algunos bugs de seguridad aterrador introducidos por este tipo de cosas.


Para los directorios, desea hacer: ln -sfT / location / to / new / target old_linkname


Pruebe ln -sf new_destination linkname .


Puede crear el nuevo enlace con un nombre diferente, luego moverlo para reemplazar el enlace anterior.

ln -s /location/to/link linkname

Luego

ln -s /location/to/link2 newlink mv newlink linkname

Si newlink y linkname están en el mismo dispositivo físico, el mv debería ser atómico.


Si los destinos de enlace simbólico son directorios, debe agregar el indicador -T al comando mv ; de lo contrario, moverá el enlace simbólico nuevo al directorio de destino del enlace simbólico antiguo.

Ejemplo de cambio atómico de un sitio web a una nueva versión:

Configuración original: el sitio web se almacena en el directorio www1 , vhost apuntando a www symlink:

ln -s www1 www

Navegue a la página web, vea la versión anterior.

Coloque nuevos archivos de sitio web en el nuevo directorio www2 .

Configure el nuevo enlace simbólico al nuevo sitio web:

ln -s www_new www2

Mueva www symlink al directorio del nuevo sitio web:

mv -T www_new www

Navegue hasta el sitio web, vea la nueva versión de inmediato.


Simplemente busqué en Google, no encontré una buena respuesta y tuve que resolverlo solo:

ln -f -s -T `readlink SomeLibrary | sed ''s/version.old/version.new/''` SomeLibrary

Editar por definición significa no volver a crear desde el principio, sino cambiar parcialmente. Cualquier respuesta que requiera memorizar un camino, tal vez larga o con símbolos extraños, es definitivamente mala.


Solo cambia el objetivo de enlace simbólico:

# ln -sfT /path/to/new/target linkname

Este es un cambio atómico instantáneo.