Comment créer un lien symbolique relatif sous Linux?


62

J'ai besoin d'un lien symbolique qui résout par rapport au répertoire dans lequel il est placé. Quelle commande est utilisée pour créer une telle chose?

Réponses:


78
  1. Allez dans le répertoire dans lequel vous voulez que le lien réside
  2. Lancer la commande ln -s ../some/other/file linkname

Le chemin que vous indiquez est stocké avec le fichier. Lorsque vous accédez au fichier, le chemin stocké est recherché et développé par rapport au fichier. Il ne sait pas dans quel répertoire vous vous trouviez lorsque vous avez créé le lien.


23
Non tu ne le fais pas. Vous devez simplement vous assurer que vous spécifiez l'emplacement par rapport au nom du lien au lieu de votre répertoire actuel.
Ignacio Vazquez-Abrams

5
Pour aider à comprendre: Le chemin que vous indiquez est stocké avec le fichier. Lorsque vous accédez au fichier, le chemin stocké est recherché et développé par rapport au fichier. Il ne sait pas dans quel répertoire vous vous trouviez lorsque vous avez créé le lien.
Marian

2
exactement équivalente:ln -s ../some/other/file /some/dir/linkname
sehe

1
Au lieu de descendre dans un répertoire et de le remonter, vous pouvez également le faire, ln -s ./file linknamecar il .fait référence au répertoire actuel.
Pduersteler

1
ln -s somedir/original-dir link-namene marche pas. Il crée un répertoire avec le nom link-namequi contient un lien non valide. La commande qui fonctionne estln -sr somedir/original-dir link-name
Lorenz Meyer

28

Les versions récentes de ln (> = 8.16) de GNU coreutils prennent en charge l’ option --relative(ou -r), ce qui signifie que vous pouvez appeler ln -savec 2 chemins absolus ou relatifs (par rapport à votre répertoire de travail) et il déterminera le chemin relatif correct qui doit être écrit sur le lien symbolique.


2
Merci. Cette -roption est utile lorsque vous effectuez une compilation croisée et que vous avez besoin de chemins absolus sur l'hôte de construction, mais relatifs sur la cible.
Robert Calhoun

rdfind peut produire de très mauvais liens symboliques qui ne sont pas seulement absolus, mais qui permettent de revenir en arrière sur des répertoires sans raison. ln -r -s targetfile myaliaspeut vous aider à résoudre le problème
Ray Foss

2

Ce que vous devez comprendre, c’est qu’un lien symbolique ressemble plus à un fichier texte qu’à une entrée de répertoire qui contient un fichier. Donc si tu

echo ../poo >/file/name

alors c'est assez similaire à

ln -s ../poo /file/name

Le système ne se soucie pas de savoir s'il /file/../pooexiste, c'est juste un morceau de texte qui est placé dans le lien symbolique. Lorsque quelque chose essaie d' ouvrir le lien symbolique, le système essaie de le résoudre.

Si vous utilisez un shell avec l'achèvement du nom de fichier, cette fonctionnalité peut compliquer les choses en vous permettant de compléter un nom de fichier relatif à votre répertoire de travail actuel, même si vous finissez par l'utiliser comme cible d'un lien symbolique dans un autre répertoire.


Ceci est abusé par certains appels système - Je sais par exemple BSD utilisé pour vous permettre de faire un lien symbolique d' un fichier système particulier à <changer la façon dont la mémoire allouée du système. Bien sûr, il n'y a pas de fichier nommé <dans ce répertoire, il s'agit simplement d'un moyen peu coûteux de créer un très petit fichier qui présente des propriétés intéressantes par rapport à un fichier texte standard sur cette plate-forme particulière.
Tripleee

Ce lien est maintenant mort. Essayez man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5 mais notez également que le comportement dans les versions plus récentes d’OpenBSD est beaucoup moins coloré.
tripleee

0

Les liens relatifs étaient difficiles pour moi sous OS X, c’est-à-dire

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

les deux ne fonctionnaient pas (quelque chose avait été créé mais ce n'était pas un répertoire). J'ai créé le lien souhaité en utilisant des chemins absolus .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

C'est une solution viable, alors il n'est pas nécessaire que ce soit un commentaire. Cela peut rester comme une réponse séparée.
Slhck

1
Votre tentative initiale avec des liens relatifs est tout simplement fausse et c'est pourquoi cela ne fonctionne pas. Vous avez mal compris comment fonctionnent les liens relatifs. Cela n’a rien de particulièrement délicat (même si vous utilisez OS X). Peut-être avez-vous été égaré par les autres réponses concernant la modification de votre répertoire de travail lorsque vous créez le lien. C'était juste pour rendre le lien plus facile à faire et ce n'est absolument pas nécessaire. Vous ne définissez pas le chemin relatif relatif à votre répertoire actuel, mais au répertoire du lien. Voici ce que vous recherchiez:ln -s Dropbox/git/codyhess/bin ~/bin
Timo

Aussi, @slhck, quand quelqu'un demande spécifiquement comment créer des liens relatifs dans quel monde un dicton disant que vous pouvez faire des liens absolus constitue-t-il une "solution viable"? En particulier, il ne répond pas à la question des PO et est donc tout le contraire de solution, ce n'est pas une solution. Cela ne devrait pas être un commentaire ni une réponse, mais plutôt une question "Comment fonctionnent exactement les liens relatifs (expliqué pour que les utilisateurs de mac le comprennent)?". J'espère que cet utilisateur mac l'explique maintenant assez bien. :)
Timo

@TimoLehto Peut-être que vous souhaitez adresser le commentaire à l'auteur original (Cody Hess). J'ai seulement copié le post.
Slhck

@slhck, je vous l'ai indiqué, car vous avez jugé la solution "viable" et votre commentaire m'a incité à penser que vous seriez la personne à qui convaincre si l'on voulait signaler la réponse comme "pas une réponse" (et obtenir le signalement accepté).
Timo

0

Je voulais juste expliquer plus en détail comment créer un lien symbolique en utilisant des chemins relatifs (avec un exemple détaillé).

Comme Ignacio Vazquez-Abrams est mentionné dans les commentaires, vous devez spécifier l'emplacement du fichier / dossier par rapport à l'emplacement de création du lien symbolique et non par rapport à votre répertoire actuel.

EXEMPLE

Vous êtes dans /usr/share/nginx/html/_src/learn Vous allez créer un lien symbolique codingdans/usr/share/nginx/html

Créer un lien symbolique relatif (théorie):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Créer un lien symbolique relatif actuel:

sudo ln -s ./_src/learn/coding ../../coding

Plus d'informations (même exemple)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.