web-dev-qa-db-fra.com

Créer un lien symbolique vers un chemin d'accès relatif

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?

65
Humphrey Bogart

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 /).

66
penguin359

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
25
ptr

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.

12
Shadur

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
3
MattBianco

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
1
emp.justine

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.

0
mreff555