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?
David Zorychta
fuente
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
slm
fuente
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
Steen Schütt
fuente
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
Stéphane Chazelas
fuente
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
JISHNU TU
fuente
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)"
cerveza de pan
fuente