Як бачити повний шлях до симпосилання


128

Коли я використовую ls -la symlinkNameчи stat symlinkNameне весь шлях відображається (наприклад ../../../one/two/file.txt)

Що таке команда linux, яка розкриває повний шлях?


4
Тут слід бути обережним: коли показник ls або stat не має абсолютного шляху - посилання не має абсолютного шляху! Це esp. важливо, коли пристрій встановлено, наприклад, в іншому контексті (наприклад, якщо у вас щось є на компакт-диску або usb-stick або намагаєтеся відновити зламаний hdd). Всі згадані рішення (realpath, readlink, ....) показують лише абсолютний шлях у змонтованому контексті.
флоло

Відповіді:


225

realpathдоступний не для всіх типів Linux, але readlinkповинен бути.

readlink -f symlinkName

Сказане повинно зробити трюк.

Крім того, якщо у вас немає жодного з встановлених вище, ви можете зробити наступне, якщо у вас встановлений python 2.6 (або пізніший)

python -c 'import os.path; print(os.path.realpath("symlinkName"))'

16
Якщо ви використовуєте OSX, опустіть -fпрапор і тоді це працює. тобтоreadlink symlinkName
Джош Давенпорт

6
на OSX опускання прапора -f дає лише відносний шлях
timoxley

2
Це питання стосувалося Linux, ви всі.
Іван Стейплтон Кордаско

27

realpath <path to the symlink file> повинен зробити трюк.


man realpathвнизу показує, що вона є частиною "GNU coreutils", яка, я впевнений, завжди поставляється на Ubuntu, тому, хоча @IanStapletonCordasco каже, " realpathне доступний для всіх Linux-ароматів", він повинен бути принаймні доступним для всіх Я вважаю, похідні ароматів Ubuntu та Ubuntu.
Габріель Степлес

10

Unix ароматизатори -> ll symLinkName

OSX -> readlink symLinkName

Різниця - це 1-й спосіб, який би моргав відображати шлях посилання sym, а другий спосіб просто перегукував би його на консолі.


Питання задавали конкретно повний / абсолютний шлях, а не відносний шлях (../../file.txt). Обидві ці відповіді дадуть відносний шлях.
вісбукі

3

Ще один спосіб бачити інформацію - це statкоманда, яка покаже більше інформації. Команда stat ~/.sshна дисплеї моєї машини

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

Сподіваюся, це може комусь допомогти.


1

Ви можете використовувати awkза допомогою systemвиклику, readlinkщоб отримати еквівалент lsвиводу з повними шляхами симпосилання. Наприклад:

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

Відобразиться, наприклад

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

ls може це зробити без зчитування; просто використовувати ls -l. Це також зовсім не працює, намагається зробити це у всьому, що знаходиться в каталозі (без посилань), і якщо ваш ls налаштований на використання кольорів, awk повністю зривається. просто використовуйтеfind . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
Hashbrown
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.