Créer un lien symbolique relatif au répertoire en cours

110

J'essaie de créer un lien symbolique dans mon répertoire personnel qui pointe vers un répertoire de mon disque dur externe.

Cela fonctionne bien quand je le spécifie comme ceci:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Cependant, cela crée un lien défectueux lorsque j'essaie ceci:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Cela crée un lien dans lequel je ne peux pas cd.

Quand j'essaye, bash se plaint:

bash: cd: Data: Too many levels of symbolic links

Le lien symbolique Données de mon domicile est également coloré en rouge lorsqu'il lsest configuré pour afficher une sortie en couleur.

Pourquoi cela arrive-t-il? Comment puis-je créer un lien de cette manière? (Je veux créer un lien symbolique vers un répertoire de mon répertoire de travail situé dans un autre répertoire.)


Edit: selon cette réponse de StackOverflow, si le deuxième argument (dans mon cas, ce serait ~ / Data) existe déjà et est un répertoire, lncréera un lien symbolique vers la cible à l' intérieur de ce répertoire.

Cependant, je rencontre le même problème avec:

ln -s Data/ ~/
jcora
la source
7
Juste un conseil aléatoire: cd ~est généralement le même que cd.
3
ls -l ~/Datavous aurait aidé à voir ce qui n'allait pas avec le lien "rouge".
msw
Hm, je ne savais pas que je pouvais faire ça, merci. Je me souviens de l'avoir essayé cat, mais j'ai oublié quel était le résultat ... (Je ne suis pas chez moi à ce moment-là.)
jcora
Remarque secondaire, supposons que vous souhaitiez créer uniquement un lien symbolique de tous les fichiers, dir et subdir dans un dossier particulier, par exemple, tous les éléments /run/media/name/exhdd/Data/qu'il Dataln -s /run/media/name/exhdd/Data/* Data
contient

Réponses:

115

Voici ce qui se passe. Si vous faites un lien symbolique avec un chemin relatif, le lien symbolique sera relatif. Les liens symboliques stockent simplement les chemins que vous leur donnez. Ils ne résolvent jamais les chemins en chemins complets. Fonctionnement

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

crée un lien symbolique nommé ls2dans /usr/binla ls( à savoir. /usr/bin/ls) par rapport au répertoire que le lien symbolique est en ( /usr/bin). La commande ci-dessus créerait un lien symbolique fonctionnel à partir de n'importe quel répertoire.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Si vous avez déplacé le lien symbolique dans un autre répertoire, il cessera de pointer vers le fichier situé dans /usr/bin/ls.

Vous faites un lien symbolique qui pointe vers Data, et le nommer Data. Il se pointe à lui-même. Vous devez créer un lien symbolique avec le chemin absolu du répertoire.

ln -s "$(realpath Data)" ~/Data
Ujjwal Singh
la source
14

J'avais le même problème. Google a donné cette réponse mais la solution la plus simple n’est pas documentée ici:

ln -sT 

-T fait le tour

homme ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Il suffit d'ajouter ceci ici pour que quiconque ayant la même question trouve ceci :)

tiegs
la source
9

lnLe comportement des chemins relatifs n'est pas intuitif. Pour rétablir la santé mentale, utilisez le -rdrapeau.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Explication:

   -r, --relative
          create symbolic links relative to link location

Cela signifie que cela lnfera ce que vous attendez. Il tiendra compte du répertoire dans lequel vous vous trouvez, du répertoire dans lequel se trouve la cible et construira un chemin relatif au répertoire dans lequel le lien se trouvera. Le comportement par défaut (sans -r) consiste à interpréter le premier paramètre (cible) à la lettre , dans Dans ce cas, vous devez construire le chemin vous-même pour qu'il soit valide dans le répertoire du lien.

Sinon, utilisez un chemin absolu, comme mentionné par @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

ou

ln -s "(realpath Data)" ~/Data #fish shell
Aleksandr Dubinsky
la source
-1

Très simplement, vous pouvez créer un lien pour un dossier. Regarde ma commande

ln -s / home / répertoire / targated / var / www / html / nom_lien

Bhupendra Sahu
la source