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 en quelque sorte résoudre le chemin relatif et le transmettre ln
?
ln -s $(pwd)/bar.txt ~/
ou inclure un script d'installation.ln -s foo/bar.txt /home/beau/bar.txt
Réponses:
Si vous créez un lien symbolique vers un chemin relatif, il sera stocké sous la forme d'un 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 où il
ln
est exécuté.Tu peux faire:
Ou pour que ça compte:
Il est important de réaliser que le premier argument suivant
ln -s
est stocké en tant que cible du lien symbolique. Il peut s'agir de n'importe quelle chaîne arbitraire (avec les seules restrictions qu'il ne peut pas être vide ni 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 d'accès relatif au fichier. répertoire parent du lien symbolique (quand il ne commence pas par/
).la source
~
marcherait.Si vous utilisez des coreutils plus récents (j'utilise coreutils-8.22-11), une option vous le permet:
peut contenir du texte arbitraire; si elle est résolue ultérieurement, un lien relatif est -r, --relative crée des liens symboliques relatifs à l'emplacement du lien.
Par exemple:
la source
-r
. En utilisant Mac cependant.coreutils
> = 8.16 (source: superuser.com/a/837935/403979 )Non désolé. Les liens symboliques sont relatifs à l'emplacement du lien, pas à l'emplacement où vous vous trouviez lorsque vous avez créé le lien. Il existe plusieurs bonnes raisons à ce comportement, la plupart impliquant le montage de systèmes de fichiers distants.
la source
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 dans un répertoire en relatif:
Malheureusement, il n'y a pas d'option pour convertir un seul lien, vous devez d'abord le déplacer vers son propre répertoire.
la source
Tu pourrais essayer:
Mais, cela crée un lien symbolique avec le chemin absolu. Votre question textuelle demande mentionne le nom de chemin relatif ...
Normalement, un chemin relatif est ce que vous voulez et ce que
ln -s
vous donne. Je pense que ce que tu veux c'est:la source
Comme les shells les plus courants développent les chemins, pour créer un lien symbolique relatif, vous devez citer le "chemin source".
En outre, le
-s
paramètre signifie--symbolic
.ln
crée des liens durs par défaut.la source
Si vous êtes certain qu'il n'y a aucune chance que vos points de montage changent, vous pouvez obtenir ce que vous essayez de faire dans un shell bash comme ceci:
Cela suppose que vous vous trouvez dans le répertoire cible lors de la création du lien symbolique.
la source