143 votes

Trouver la cible d'un lien symbolique via la ligne de commande

Disons que je crée un lien symbolique :

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

existe-t-il un moyen de voir quelle est la cible de myothertextfile.txt utilise la ligne de commande ?

1voto

7ochem Points 280

Si vous ne pouvez pas utiliser readlink puis analyse le résultat de ls -l pourrait être fait comme ceci.

Le résultat normal serait :

ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan  1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt

Nous voulons donc remplacer tout ce qui se trouve avant " -> " et la flèche incluse. Nous pourrions utiliser sed pour ça :

ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt

1voto

Nico Points 11

La question n'est pas assez précise pour donner une réponse simple comme celle de brian-brazil :

readlink -f some_path

déréférencera en effet tous les liens symboliques impliqués dans la construction du chemin vers le objectif final derrière some_path .

Mais un niveau de liens symboliques en cascade est juste un cas particulier parmi d'autres dans un système, le cas général étant N niveaux de liens symboliques en cascade. Regardez ce qui suit sur mon système :

$ rwhich emacs
/usr/bin/emacs
 /etc/alternatives/emacs
  /usr/bin/emacs24-x

rwhich est ma propre implémentation récursive de which qui imprime tous les liens symboliques intermédiaires en cascade (vers stderr) jusqu'à la cible finale (vers stdout).

Alors si je veux savoir ce qui est :

  • la cible du lien symbolique /usr/bin/emacs**, la réponse évidente pour moi est /etc/alternatives/emacs tel que retourné par :

    readlink $(which emacs)
    readlink /usr/bin/emacs
  • le site final cible derrière les liens symboliques en cascade /usr/bin/emacs, la réponse sera /usr/bin/emacs24-x tel que retourné par :

    readlink -f $(which emacs)
    readlink -f /usr/bin/emacs
    rwhich emacs 2>/dev/null

0voto

Mantz Points 1

ll o ls -l devrait lister les éléments du répertoire, y compris votre lien symbolique et sa cible.

cd -P /root/Public/myothertextfile.txt (dans votre cas) devrait pointer vers le chemin d'origine

0voto

Memin Points 101

Si vous trouvez la cible de tous les liens dans un dossier et son sous-dossier, utilisez la fonction find . -type l -ls avec le type de lien comme suit :

me@local.localdomain:~/test$ find . -type l -ls
8601855888        0 lrwxr-xr-x    1 me           staff                   6 Jan 24 19:53 ./link -> target

Si vous voulez la cible d'un seul, alors ls -l devrait fonctionner :

me@local.localdomain:~/test$ ls -l 
total 0
lrwxr-xr-x  1 me  staff  6 Jan 24 19:53 link -> target
-rw-r--r--  1 me  staff  0 Jan 24 19:53 target

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X