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é).
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:
Donner le chemin complet
ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
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
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é.
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
.
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
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.