Comment voir le chemin complet du lien symbolique

128

Quand j'utilise ls -la symlinkName ou stat symlinkNamepas tout le chemin est affiché (par exemple ../../../one/two/file.txt)

Quelle est la commande linux qui révèle le chemin complet?

15412
la source
4
Il faut faire attention ici: lorsque ls ou stat n'affiche pas de chemin absolu - le lien n'a pas de chemin absolu! C'est esp. important lorsque l'appareil est monté, par exemple dans un contexte différent (par exemple, si vous avez quelque chose sur un CD ou une clé USB ou essayez de récupérer un disque dur cassé). Toutes les solutions mentionnées (realpath, readlink, ....) ne montrent que le chemin absolu dans le contexte monté.
flolo

Réponses:

225

realpathn'est pas disponible sur toutes les saveurs Linux, mais readlinkdevrait l'être.

readlink -f symlinkName

Ce qui précède devrait faire l'affaire.

Sinon, si aucun des éléments ci-dessus n'est installé, vous pouvez effectuer les opérations suivantes si vous avez installé python 2.6 (ou version ultérieure)

python -c 'import os.path; print(os.path.realpath("symlinkName"))'
Ian Stapleton Cordasco
la source
16
Si vous utilisez OSX, omettez l' -findicateur et cela fonctionne. iereadlink symlinkName
Josh Davenport
6
sur OSX, omettre l'indicateur -f ne donne qu'un chemin relatif
timoxley
2
Cette question concernait Linux, vous tous.
Ian Stapleton Cordasco
27

realpath <path to the symlink file> devrait faire l'affaire.

JosephH
la source
man realpathmontre en bas qu'il fait partie de "GNU coreutils", qui, j'en suis sûr, est toujours disponible sur Ubuntu, donc même si @IanStapletonCordasco dit " realpathn'est pas disponible sur toutes les saveurs Linux", il devrait au moins être disponible sur tous Je crois que les saveurs dérivées d'Ubuntu et d'Ubuntu.
Gabriel Staples le
10

saveurs unix -> ll symLinkName

OSX -> readlink symLinkName

La différence est que la 1ère manière afficherait le chemin du lien symbolique de manière clignotante et la 2ème manière le ferait simplement en écho sur la console.

Rupam
la source
La question demandait spécifiquement le chemin complet / absolu, pas le chemin relatif (../../file.txt). Ces deux réponses donneront le chemin relatif.
wisbucky
3

Une autre façon de voir les informations est la statcommande qui affichera plus d'informations. Commande stat ~/.sshsur l'écran de ma machine

File: ‘/home/sumon/.ssh’ -> ‘/home/sumon/ssh-keys/.ssh.personal’
  Size: 34          Blocks: 0          IO Block: 4096   symbolic link
Device: 801h/2049d  Inode: 25297409    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   sumon)   Gid: ( 1000/   sumon)
Access: 2017-09-26 16:41:18.985423932 +0600
Modify: 2017-09-25 15:48:07.880104043 +0600
Change: 2017-09-25 15:48:07.880104043 +0600
 Birth: -

J'espère que cela peut aider quelqu'un.

Engr. Hasanuzzaman Sumon
la source
1

Vous pouvez utiliser awkavec un systemappel readlinkpour obtenir l'équivalent d'une lssortie avec des chemins de lien symbolique complets. Par exemple:

ls | awk '{printf("%s ->", $1); system("readlink -f " $1)}'

Affiche par exemple

thin_repair ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_restore ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_rmap ->/home/user/workspace/boot/usr/bin/pdata_tools
thin_trim ->/home/user/workspace/boot/usr/bin/pdata_tools
touch ->/home/user/workspace/boot/usr/bin/busybox
true ->/home/user/workspace/boot/usr/bin/busybox
user3467349
la source
Je peux le faire sans readlink; juste utiliser ls -l. Cela ne fonctionne pas du tout non plus, essaie de le faire sur tout ce qui se trouve dans le répertoire (non-liens) et si votre ls est configuré pour utiliser des couleurs awk se brise complètement. il suffit d'utiliserfind . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
Hashbrown