web-dev-qa-db-fra.com

Pourquoi mon lien symbolique ne fonctionne-t-il pas?

J'essaie de mieux comprendre les liens symboliques ... et de ne pas avoir beaucoup de chance. Voici la sortie de mon shell avec le nom d'utilisateur/l'hôte modifié:

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

Je pensais qu'un lien symbolique était censé fonctionner de manière transparente, en ce sens que vous pouviez agir sur le fichier sur lequel il pointe comme si vous y accédiez directement (sauf bien sûr dans le cas de rm où bien sûr le lien est simplement enlevé).

20
orokusaki

Les liens symboliques ont tendance à aimer les chemins complets ou relatifs au lien, sinon ils peuvent souvent chercher file-1.txt localement (assez curieusement).

Naviguez jusqu'à proper et exécutez ls -l et vous verrez que le lien symbolique recherche actual/file-1.txt, alors qu'il devrait être ../actual/file-1.txt.

Donc, vous avez deux options:

  1. Donner le chemin complet

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
    
  2. Accédez au dossier dans lequel vous souhaitez insérer le lien, puis un lien à partir de là.

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

Edit : un conseil pour sauvegarder la saisie.

Vous pouvez juste faire ln -s ~/actual/file-{1,2}.txt ~/proper

Les éléments dans les accolades sont substitués et placés les uns après les autres, créant la commande

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

Le problème est l'utilisation de chemins relatifs. Si vous spécifiez la création de votre lien avec le chemin explicite complet, cela fonctionne.

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

$ cat convenable/fichier1.txt

fichier 1

$

Votre exemple crée dans proper des liens qui recherchent un sous-répertoire nommé real dans le répertoire en cours, plutôt que le parent-des-deux auquel il est destiné.

3
Don Simon

Les liens symboliques peuvent être délicats. Essentiellement, un lien symbolique est un fichier contenant un nom de fichier/chemin d'accès pour un autre fichier (et marqué pour un traitement spécial). Si le nom de chemin dans le fichier de liens commence par "/", il est alors traité comme un chemin absolu et les choses sont assez simples. Si elle ne commence pas par une barre oblique, elle est traitée comme un chemin relatif - par rapport au répertoire dans lequel se trouve le lien. (Ceci est vrai que le nom contienne ou non des barres obliques.) Ainsi, vous avez créé proper/file–1.txt en tant que lien vers "actual/file–1.txt" et, lorsque vous avez essayé d'y accéder, le système a tenté d'accéder à proper/actual/file–1.txt. Tu aurais du dire

ln –s  ../actual/file–1.txt  ../actual/file–2.txt  proper

En passant, vous n’avez pas besoin des commandes touch. echo "file 1" > actual/file–1.txt est suffisant pour créer actual/file–1.txt.

1
Scott

Lorsque vous essayez de créer un lien vers un fichier qui n'existe pas (ou que vous avez mal indiqué le chemin), ln -s ne génère pas d'erreur. Il crée un lien, mais lorsque vous essayez "cat" sur ce lien, il indique qu'aucun fichier n'a été trouvé. Même quand vous pouvez le voir en utilisant ls. Dans ce cas, vérifiez toujours votre chemin de fichier.

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

Parce que le fichier etc/ufw/ufw.conf n’existe pas. Le chemin correct est /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
0
sindhura

Un problème connexe, qui peut sembler évident à beaucoup de gens, mais qui m’a bouleversé pendant quelques minutes: si vous créez un lien symbolique dans un répertoire lui-même, ou qu’il existe un lien symbolique dans le chemin du répertoire de travail actuel, vous pouvez rencontrer des problèmes avec des liens symboliques ne fonctionne pas.

Utilisez cd .. et ls -l à plusieurs reprises pour voir si vos répertoires parents sont eux-mêmes liés symboliquement.

Si vous devez créer un lien symbolique, cd vers le répertoire cible d'origine, et créer de nouveaux liens symboliques à cet emplacement, afin que les chemins relatifs soient exacts.

Ou pour le dire autrement: le chemin relatif va de l'origine à la cible. Si l'origine est ensuite liée par un lien symbolique, ce n'est pas grave. Cependant, vous pourriez rencontrer des problèmes lors de la configuration d’un nouveau nom origine link_name dans un répertoire lui-même lié de façon symbolique.

0
Chrisky