Crear un enlace simbólico relativo al directorio actual

110

Estoy tratando de crear un enlace simbólico en mi directorio de inicio que apunte a un directorio en mi HDD externo.

Funciona bien cuando lo especifico así:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Sin embargo, crea un enlace defectuoso cuando intento esto:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Esto crea un enlace en el que no puedo cdentrar.

Cuando lo intento, bash se queja:

bash: cd: Data: Too many levels of symbolic links

El enlace simbólico de datos en mi casa también está coloreado en rojo cuando lsestá configurado para mostrar la salida en color.

¿Por qué está pasando esto? ¿Cómo puedo crear un enlace de esa manera? (Quiero crear un enlace simbólico a un directorio en mi directorio de trabajo en otro directorio).


Editar: de acuerdo con esta respuesta de StackOverflow, si el segundo argumento (en mi caso, que sería ~ / Data) ya existe y es un directorio, lncreará un enlace simbólico al destino dentro de ese directorio.

Sin embargo, estoy experimentando el mismo problema con:

ln -s Data/ ~/
jcora
fuente
77
Solo un consejo al azar: cd ~suele ser lo mismo que cd.
3
ls -l ~/Datate habría ayudado a ver qué estaba mal con el enlace "rojo".
msw
Hm, no sabía que podía hacer eso, gracias. Recuerdo tratar de catella, pero me olvidé de lo que fue el resultado ... (no estoy en casa en el momento en ellas.)
jcora
Nota al margen, suponga que solo desea crear un enlace simbólico de todos los archivos, dir y subdir dentro de una carpeta en particular, digamos, todos los elementos dentro /run/media/name/exhdd/Data/para Dataluego usar lo siguienteln -s /run/media/name/exhdd/Data/* Data
user2555595

Respuestas:

115

Esto es lo que está pasando. Si crea un enlace simbólico con una ruta relativa, el enlace simbólico será relativo. Los enlaces simbólicos solo almacenan los caminos que les das. Nunca resuelven caminos a caminos completos. Corriendo

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

crea un enlace simbólico llamado ls2en el /usr/binque ls(a saber. /usr/bin/ls) en relación con el directorio que el enlace simbólico está en ( /usr/bin). El comando anterior crearía un enlace simbólico funcional desde cualquier directorio.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Si movió el enlace simbólico a un directorio diferente, dejaría de apuntar al archivo en /usr/bin/ls.

Está creando un enlace simbólico que apunta Datay lo nombra Data. Se está apuntando a sí mismo. Tienes que hacer un enlace simbólico con la ruta absoluta del directorio.

ln -s "$(realpath Data)" ~/Data
Ujjwal Singh
fuente
14

Estaba teniendo el mismo problema. Google llevó a esta respuesta, pero la solución más simple no está documentada aquí:

ln -sT 

-T hace el truco

hombre ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Simplemente agregue esto aquí para que cualquier persona con la misma pregunta pueda encontrar esto :)

Tiegs
fuente
9

lnEl comportamiento de las rutas relativas es poco intuitivo. Para restaurar la cordura, usa la -rbandera.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Explicación:

   -r, --relative
          create symbolic links relative to link location

Lo que significa es que lnhará lo que esperas. Tendrá en cuenta en qué directorio se encuentra, en qué directorio se encuentra el objetivo, y construirá una ruta relativa al directorio en el que estará el enlace. El comportamiento predeterminado (sin -r) es interpretar el primer parámetro (objetivo) literalmente , en en cuyo caso debe construir la ruta usted mismo para que sea válida en el directorio del enlace.

Alternativamente, use una ruta absoluta, como lo menciona @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

o

ln -s "(realpath Data)" ~/Data #fish shell
Aleksandr Dubinsky
fuente
-1

Simplemente puede crear un enlace para una carpeta. Mira mi comando

ln -s / home / targatedfolder / var / www / html / link_name

Bhupendra Sahu
fuente