Cómo ver la ruta completa del enlace simbólico

128

Cuando estoy usando ls -la symlinkNameo stat symlinkNameno, se muestra toda la ruta (por ejemplo ../../../one/two/file.txt)

¿Cuál es el comando de Linux que revela la ruta completa?

15412s
fuente
4
Hay que tener cuidado aquí: cuando ls o stat no muestran una ruta absoluta, ¡el enlace no tiene una ruta absoluta! Esto es esp. importante cuando el dispositivo está montado, por ejemplo, en un contexto diferente (por ejemplo, si tiene algo en un CD o memoria USB o intenta recuperar un disco duro roto). Todas las soluciones mencionadas (realpath, readlink, ....) muestran solo la ruta absoluta en el contexto montado.
flolo

Respuestas:

225

realpathno está disponible en todas las versiones de Linux, pero readlinkdebería estarlo.

readlink -f symlinkName

Lo anterior debería funcionar.

Alternativamente, si no tiene ninguno de los anteriores instalados, puede hacer lo siguiente si tiene instalado Python 2.6 (o posterior)

python -c 'import os.path; print(os.path.realpath("symlinkName"))'
Ian Stapleton Cordasco
fuente
16
Si usa OSX, omita la -fbandera y entonces esto funciona. iereadlink symlinkName
Josh Davenport
6
en OSX omitir el indicador -f solo da una ruta relativa
timoxley
2
Esta pregunta era sobre Linux, todos ustedes.
Ian Stapleton Cordasco
27

realpath <path to the symlink file> debería hacer el truco.

JosephH
fuente
man realpathmuestra en la parte inferior que forma parte de "GNU coreutils", que estoy bastante seguro de que siempre viene en Ubuntu, así que aunque @IanStapletonCordasco dice " realpathno está disponible en todos los sabores de Linux", al menos debería estar disponible en todos Sabores de Ubuntu y derivados de Ubuntu, creo.
Gabriel Staples
10

sabores unix -> ll symLinkName

OSX -> readlink symLinkName

La diferencia es que la primera forma mostraría la ruta del enlace simbólico de forma intermitente y la segunda forma simplemente lo haría eco en la consola.

Rupam
fuente
La pregunta pedía específicamente la ruta completa / absoluta, no la ruta relativa (../../file.txt). Ambas respuestas darán la ruta relativa.
wisbucky
3

Otra forma de ver la información es el statcomando que mostrará más información. Comando stat ~/.sshen la pantalla de mi máquina

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: -

Espero que esto pueda ayudar a alguien.

Ing. Hasanuzzaman Sumon
fuente
1

Puede usar awkcon una systemllamada readlinkpara obtener el equivalente de una lssalida con rutas de enlace simbólicas completas. Por ejemplo:

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

Mostrará, por ejemplo,

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
usuario3467349
fuente
Puede hacerlo sin readlink; solo usa ls -l. Esto tampoco funciona en absoluto, intenta hacerlo en todo en el directorio (no enlaces) y si su ls está configurado para usar colores, awk se rompe por completo. solo usefind . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
Hashbrown