Je peux le faire:
$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt
Mais j'aimerais pouvoir faire ceci:
$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
Est-ce possible? Puis-je résoudre le chemin d'accès relatif et le transmettre à ln
?
Si vous créez un lien symbolique vers un chemin relatif, il le stockera en tant que lien symbolique relatif, et non absolu comme le montre votre exemple. C'est généralement une bonne chose. Les liens symboliques absolus ne fonctionnent pas lorsque le système de fichiers est monté ailleurs.
La raison pour laquelle votre exemple ne fonctionne pas est qu'il est relatif au répertoire parent du lien symbolique et non à l'emplacement d'exécution de ln
.
Tu peux faire:
$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt
Ou pour ce qui compte:
$ cd foo
$ ln -s foo/bar.txt ../bar.txt
Il est important de réaliser que le premier argument après ln -s
est stocké comme cible du lien symbolique. Il peut s'agir de n'importe quelle chaîne arbitraire (avec les seules restrictions qu'elle ne peut pas être vide et ne peut pas contenir le caractère NUL), mais au moment où le lien symbolique est utilisé et résolu, cette chaîne est comprise comme un chemin relatif vers le répertoire parent du lien symbolique (lorsqu'il ne commence pas par /
).
Si vous utilisez des coreutils plus récents (j'utilise coreutils-8.22-11), il a une option pour le faire:
ln --help | grep relative
peut contenir du texte arbitraire; s'il est résolu ultérieurement, un lien relatif est -r, --relative crée des liens symboliques relatifs à l'emplacement du lien
Par exemple:
$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
lrwxrwxrwx 1 ptr ptr 4 aug 25 17.02 /tmp/test/to -> from
Non désolé. Les liens symboliques sont relatifs à l'emplacement où se trouve le lien, et non à l'emplacement où vous vous trouviez lorsque vous avez créé le lien. Il existe plusieurs bonnes raisons à ce comportement, dont la plupart impliquent le montage de systèmes de fichiers distants.
Il existe un petit utilitaire pratique appelé symlinks
(à l'origine par Mark Lords, maintenant maintenu par J. Brandt Buckley), présent dans de nombreuses distributions Linux.
Pour convertir tous les liens symboliques absolus d'un répertoire pour qu'ils soient relatifs:
symlinks -c /path/to/directory
Malheureusement, il n'y a pas d'option pour convertir un seul lien, vous devez d'abord le déplacer dans son propre répertoire.
mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp
Tu pourrais essayer:
ln -s `pwd`/bar.txt /home/beau/bar.txt
Mais, il établit un lien symbolique avec le nom de chemin absolu. Votre question textuelle demande des mentions de chemin relatif ...
Normalement, un chemin d'accès relatif correspond à ce que vous voulez et à ce que ln -s
vous donne. Je pense que ce que vous voulez c'est:
cd /home/beau
ln -s foo/bar.txt bar.txt
Comme les shells les plus courants développent des chemins, pour créer un lien symbolique relatif, vous devez citer le "chemin source".
Également -s
paramètre signifie --symbolic
. ln
crée des liens durs par défaut.
$ ln -s '../../relative_path' path
$ ls -al path
lrwxrwxrwx 1 empjustine empjustine 19 Aug 6 01:38 path -> ../../relative/path
Si vous êtes certain qu'il n'y a aucune chance que vos points de montage changent, vous pouvez réaliser ce que vous essayez de faire dans un shell bash comme ceci:
ln -s `pwd`/bar.txt ~/bar.txt
Cela suppose que vous êtes dans le répertoire cible lors de la création du lien symbolique.