Demasiados niveles de enlaces simbólicos


100

Creé esta estructura de archivos:

test/src
test/firefox

Cuando ejecuto este comando:

ln -s test/src test/firefox

Esperaría test/firefox/srcque se creara un enlace simbólico apuntando a test/src, sin embargo, aparece este error:

-bash: cd: src: Too many levels of symbolic links
  • ¿Qué estoy haciendo mal?
  • ¿No puede crear un enlace simbólico a una carpeta que está almacenada en un hermano de esa carpeta?
  • ¿Cuál es el punto de esto?

No estoy seguro de seguir lo que hiciste. Publique la salida de ls -ld test test/*, o la secuencia exacta de comandos que ejecutó para crear estos archivos.
Gilles

prueba de mkdir; prueba mkdir / src; prueba mkdir / firefox; ln -s test / src test / firefox
David Zorychta

Con estos comandos, cd test/firefox/srcmostraría el error cd: no such file or directory: test/firefox/src, porque test/firefox/srces un enlace simbólico que cuelga. ¿Estás ejecutando cdalgún otro enlace simbólico llamado src?
Gilles

Estoy seguro de que hizo algo entre el ln -sy el cdque no nos dice. Suponiendo que solo hay un testsubdirectorio en su directorio actual, a cd src(o lo que sea que haya ejecutado) debería arrojar un error. ¿Pusiste algo en test/firefox?
Dubu

55
Y como @Gilles dio una pista, ese enlace no hará lo que crees que hace. Los enlaces simbólicos con objetivos relativos siempre son relativos al directorio de enlace simbólico , no al directorio desde el que creó el enlace. Por lo tanto, al estar en un directorio /some/path, a ln -s test/src test/firefoxcreará un enlace simbólico que apunta de /some/path/test/firefox/srca /some/path/test/firefox/test/src, no a /some/path/test/src.
Dubu

Respuestas:


32

En la superficie, lo que has sugerido que has probado funciona para mí.

Ejemplo

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

Haz el enlace simbólico:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

Ejecutarlo por segunda vez normalmente produciría esto:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

Entonces, es probable que tenga algo más aquí. Sospecho que tiene una referencia circular donde un enlace apunta hacia sí mismo.

Puedes usarlo findpara detectar esto un poco:

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15reveló el culpable
user7610

168

Como Dubu señala en un comentario, el problema radica en sus caminos relativos. Tuve un problema similar al simular mi configuración nginx de /usr/local/etc/nginxa /etc/nginx. Si crea su enlace simbólico de esta manera:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

De hecho, creará el enlace / etc / nginx -> / etc / nginx, porque la ruta de origen es relativa a la ruta del enlace. La solución es tan simple como usar rutas absolutas:

ln -s /usr/local/etc/nginx /etc/nginx

58
Esta respuesta fue más clara que la otra. "Usar rutas absolutas".
wulftone

1
Puedo confirmar que esto funcionó para mí en Windows usando cygwin. ¡Gracias!
dimiguel

A menudo tengo problemas para obtener los argumentos correctos. En OSX y GNU Linux, se invierten, lo que me confunde aún más.
Daniel W.

Todavía no puedo creer que esto funcione.
PNDA

55
Puede usar enlaces relativos , pero deben basarse en el directorio donde está el enlace simbólico . En otras palabras: el primer argumento debería ser el mismo que escribiría despuéscd si desea ir al directorio de destino desde el directorio donde está el archivo del enlace simbólico.
totymedli

9

Los enlaces simbólicos son relativos al directorio principal del enlace, no al directorio actual del lnproceso.

Cuando tu lo hagas:

cd /top/dir
ln -s test/src test/firefox

(donde test/firefoxhay un directorio), estás creando un test/firefox/srcenlace simbólico cuyo objetivo es test/src.

Eso test/srces relativo al test/firefoxdirectorio, por lo que es un enlace simbólico a /top/dir/test/firefox/test/src.

Si desea que ese enlace simbólico sea un enlace /top/dir/test/src, deberá escribir:

ln -s ../src test/firefox/

O

ln -s /top/dir/test/src test/firefox/

aunque generalmente es una mala idea hacer enlaces simbólicos a rutas absolutas, ya que se rompen fácilmente cuando se cambia el nombre de los directorios o se montan los sistemas de archivos en otro lugar.

Con GNU ln, puede usar su -ropción para permitirle hacer el cálculo por sí mismo:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

5

Use la ruta absoluta en lugar de la ruta relativa, entonces funcionará.

P.ej:

ln -s /home/user/test/src /home/user/test/firefox

0

La respuesta es usar la ruta absoluta. Pero puede ser molesto escribir la ruta completa de algo que está en el directorio actual. Puede usar la sustitución de comandos de pwd para evitar eso. Si su objetivo está en el directorio actual:

ln -s "$(pwd)"/target abs/path/to/link 

Si su enlace debe estar en el directorio actual:

ln -s /abs/path/to/target "$(pwd)"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.