¿Por qué no funciona mi enlace simbólico?

24

Estoy tratando de entender mejor los enlaces simbólicos ... y no tener mucha suerte. Esta es mi salida de shell real con nombre de usuario / host cambiado:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

Pensé que se suponía que un enlace simbólico debía funcionar de manera transparente, en el sentido de que podría operar en el archivo al que apunta como si estuviera accediendo al archivo directamente (excepto, por supuesto, en el caso de rmque, por supuesto, el enlace simplemente se elimine )

orokusaki
fuente
¿Cómo se formatea tu disco? ¿Qué sistema de archivos estás usando? (FAT no admite enlaces simbólicos, pero si intenta crear un sistema de archivos FAT, debería dar un error).
Nicole Hamilton
@NicoleHamilton - Es ext4 (según df -T) - ¿El resultado anterior es extraño para ti también?
orokusaki
@orokusaki No es extraño. Vea mi respuesta a continuación. Solo un aviso, no es necesario tocar los archivos para atraparlos. Ni siquiera necesitan existir. ¡Solo para ahorrarte algo de tipeo!
nerdwaller

Respuestas:

50

Los enlaces simbólicos tienden a gustar de rutas completas o relativas al enlace, de lo contrario a menudo se pueden buscar file-1.txtlocalmente (por extraño que parezca).

Navegue propery ejecute ls -ly podrá ver que el enlace simbólico está buscando actual/file-1.txt, cuando debería estarlo ../actual/file-1.txt.

Así que tienes dos opciones:

  1. Dar el camino completo

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. Navegue a la carpeta en la que desea que esté el enlace y enlace desde allí

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

Editar : una pista para guardar la escritura.

Podrías hacer ln -s ~/actual/file-{1,2}.txt ~/proper

Los elementos en las llaves se sustituyen y se colocan uno detrás del otro, creando el comando

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

que vincula ambos archivos al directorio de destino. Guarda algunos tipeos importantes a medida que avanza en el shell.

nerdwaller
fuente
2
Gracias. Estaba a punto de arrancarme el pelo antes de leer tu respuesta.
orokusaki el
1
¡Es confuso a veces seguro! Linux tiende a ser muy literal, así que si dices hacer algo, lo hará. Tenga cuidado con las carpetas simbólicas de esa manera, he sobrescrito una o dos antes (solo especifique el nombre sin una barra inclinada). Además, no lo haga rm -rf *en una carpeta con enlaces simbólicos: puede borrar la carpeta a la que está vinculada. Solo haz rm symlinkname. Solo algunas cosas en las que he cometido errores: D
nerdwaller
3

El problema es el uso de rutas relativas. Si especifica la creación de su enlace con la ruta explícita completa, funciona.

$ ln -s ~ / actual / file1.txt ~ / actual / file2.txt ~ / proper /

$ cat propio / archivo1.txt

archivo 1

PS

Su ejemplo crea enlaces en properese aspecto para un subdirectorio llamado actual en el directorio actual, en lugar de su padre de ambos.

Don simon
fuente
1

Los enlaces simbólicos pueden ser complicados. En esencia, un enlace simbólico es un archivo que contiene un nombre de archivo / nombre de ruta para otro archivo (y que está marcado para un tratamiento especial). Si el nombre de ruta en el archivo de enlace comienza con ' /', entonces se trata como un nombre de ruta absoluto, y las cosas son bastante sencillas. Si no comienza con una barra oblicua, se trata como un nombre de ruta relativo, relativo al directorio donde se encuentra el enlace. (Esto es cierto tanto si el nombre contiene barras como si no). Por lo tanto, creó proper/file–1.txtcomo un enlace a " actual/file–1.txt", y cuando intentó acceder a él, el sistema intentó acceder proper/actual/file–1.txt. Deberías haber dicho

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

Por cierto, no necesitabas los touchcomandos.  echo "file 1" > actual/file–1.txtes suficiente para crear actual/file–1.txt.

Scott
fuente
0

Un problema relacionado, y puede ser obvio para muchos, pero me dejó perplejo durante unos minutos: si está creando un enlace simbólico dentro de un directorio que está enlazado, o si hay un enlace simbólico dentro de la ruta del directorio de trabajo actual, puede correr a problemas con enlaces simbólicos que no funcionan.

Use cd ..y ls -lrepetidamente para ver si sus directorios principales están vinculados a sí mismos.

Si necesita crear un enlace simbólico, cdal directorio de destino original, y crear nuevos enlaces simbólicos allí, para que las rutas relativas sean precisas.

O para decirlo de otra manera: la ruta relativa es desde el origen hasta el destino. Si el origen se enlaza posteriormente, está bien. Pero es posible que tenga problemas para configurar un nuevo link_name de Origin dentro de un directorio que de alguna manera esté vinculado de manera simbólica.

Chrisky
fuente
1
En lugar de " cd ..y ls -lrepetidamente", podría usar namei -mox $PWD. Otra forma útil para averiguar si hay enlaces simbólicos a lo largo de la ruta es de uso pwd -P, lo que le proporciona una ruta de acceso al directorio actual, que no contiene ningún enlaces simbólicos (por lo que si pwdy pwd -Pdar salida diferente, usted sabe que hay una en algún enlace simbólico a lo largo del camino )
Ansa211
0

Cuando intentas crear un enlace a un archivo que no existe (o has dado la ruta de forma incorrecta) ln -s no arroja un error. Crea un enlace pero cuando intentas 'cat' en ese enlace dice que no se encontró ningún archivo. Incluso cuando puedes verlo usando ls. En tales casos, siempre verifique su ruta de archivo.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

Porque el archivo etc / ufw / ufw.conf no existe. La ruta correcta es /etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low
sindhura
fuente
Ya hay una respuesta mejor, y la primera parte, que ln -s"a veces" no comprueba la existencia del objetivo es simplemente incorrecta.
RalfFriedl