¿Cómo creo un enlace simbólico relativo en Linux?

62

Necesito un enlace simbólico que se resuelva en relación con el directorio en el que se encuentra. ¿Qué comando se usa para crear tal cosa?

Jeremiah Rose
fuente

Respuestas:

78
  1. Vaya al directorio en el que desea que resida el enlace.
  2. Ejecuta el comando ln -s ../some/other/file linkname

La ruta que proporciona se almacena con el archivo. Cuando accede al archivo, la ruta almacenada se busca y se expande en relación con el archivo. No sabe en qué directorio estaba cuando creó el enlace.

Jeremiah Rose
fuente
23
No, no lo haces Solo tiene que asegurarse de especificar la ubicación relativa al nombre del enlace en lugar de su directorio actual.
Ignacio Vazquez-Abrams
55
Para ayudar a comprender: La ruta que proporciona se almacena con el archivo. Cuando accede al archivo, la ruta almacenada se busca y se expande en relación con el archivo. No sabe en qué directorio estaba cuando creó el enlace.
Marian
2
exactamente equivalente:ln -s ../some/other/file /some/dir/linkname
sehe
1
En lugar de bajar un directorio y subir de nuevo, también puede hacerlo ln -s ./file linknameya que se .refiere al directorio actual.
pduersteler
1
ln -s somedir/original-dir link-nameNo funciona. Crea un directorio con nombre link-nameque contiene un enlace no válido. El comando que funciona esln -sr somedir/original-dir link-name
Lorenz Meyer
28

Las versiones recientes de GNU coreutils 'ln (> = 8.16) admiten la opción --relative(o -r), lo que significa que puede llamar ln -scon 2 rutas absolutas o relativas (con respecto a su directorio de trabajo) y descubrirá la ruta relativa correcta que debe ser escrito en el enlace simbólico.

Viento azul
fuente
2
Gracias. La -ropción es útil cuando realiza una compilación cruzada y necesita rutas absolutas en el host de compilación, pero rutas relativas en el destino.
Robert Calhoun
rdfind puede producir algunos enlaces simbólicos realmente malos que no solo son absolutos, sino que retroceden de los directorios sin ningún motivo. ln -r -s targetfile myaliaspuede ayudarte a solucionarlo
Ray Foss
2

Lo que necesita comprender es básicamente que un enlace simbólico se parece más a un archivo de texto que a una entrada de directorio que contiene un archivo. Así que si usted

echo ../poo >/file/name

entonces eso es bastante similar a

ln -s ../poo /file/name

Al sistema no le importa si /file/../pooexiste, es solo un fragmento de texto que se coloca en el enlace simbólico. Cuando algo intenta abrir el enlace simbólico, es cuando el sistema intenta resolverlo.

Si está utilizando un shell con finalización de nombre de archivo, esta característica puede confundir las cosas al permitirle completar un nombre de archivo relativo a su directorio de trabajo actual, incluso si luego termina usando eso como el objetivo de un enlace simbólico en otro directorio completamente diferente.

tripleee
fuente
Esta es abusado por algunas llamadas al sistema - Sé por ejemplo, BSD utiliza para permitir que enlazar simbólicamente un archivo de sistema en particular a <cambiar la forma en la memoria del sistema asignada. Por supuesto, no hay un nombre de archivo <en ese directorio, es solo una forma barata de crear un archivo muy pequeño que tiene algunas propiedades atractivas sobre un archivo de texto normal en esa plataforma en particular.
tripleee
Ese enlace ahora está muerto. Pruebe man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5 pero observe también que el comportamiento en las versiones más recientes de OpenBSD es mucho menos ... colorido.
tripleee
0

Los enlaces relativos fueron difíciles para mí en OS X, es decir

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

ambos no funcionaron (se creó algo pero no era un directorio). Creé el enlace deseado usando rutas absolutas .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Cody Hess
fuente
Es una solución viable, por lo que no necesita ser un comentario. Esto puede quedar como una respuesta separada.
slhck
1
Su intento inicial con enlaces relativos es simplemente incorrecto y es por eso que no funciona. Has entendido mal cómo funcionan los enlaces relativos. No hay nada particularmente complicado al respecto (ni siquiera si está utilizando OS X). Tal vez te equivocaste con las otras respuestas hablando de cambiar tu directorio de trabajo cuando creaste el enlace. Eso fue solo para que sea más fácil hacer el enlace correctamente y de ninguna manera es necesario. No define la ruta relativa relativa a su directorio actual, sino al directorio del enlace. Esto es lo que buscabas:ln -s Dropbox/git/codyhess/bin ~/bin
Timo
También @slhck cuando alguien pregunta específicamente cómo crear enlaces relativos, ¿en qué mundo un dicho de que puedes hacer enlaces absolutos constituye una "solución viable"? Específicamente no responde la pregunta de los OP y, por lo tanto, es todo lo contrario de la solución, no es una solución. Esto no debería ser un comentario ni una respuesta, debería ser una pregunta "¿Cómo funcionan exactamente los enlaces relativos (explicados para que los usuarios de Mac lo entiendan)?". Espero que este usuario de Mac ahora lo haya explicado lo suficientemente bien. :)
Timo
@TimoLehto Quizás desee dirigir el comentario al autor original (Cody Hess). Solo copié la publicación.
slhck
@slhck, se lo he dirigido, porque consideró que la solución era "viable" y su comentario me hizo pensar que usted sería la persona que convencería si uno quisiera marcar la respuesta como "no una respuesta" (y obtener el marcado aceptado).
Timo
0

Solo quería explicar más a fondo cómo crear un enlace simbólico utilizando rutas relativas (con un ejemplo detallado).

Como Ignacio Vazquez-Abrams mencionó en los comentarios, debe especificar la ubicación del archivo / carpeta en relación con el lugar donde se creará el enlace simbólico, no en relación con su directorio actual.

EJEMPLO

Estás en /usr/share/nginx/html/_src/learn Crearás un enlace simbólico codingen/usr/share/nginx/html

Crear enlace simbólico relativo (teoría):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Crear enlace simbólico relativo real:

sudo ln -s ./_src/learn/coding ../../coding

Más información (mismo ejemplo)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
Esforzarse más
fuente