Как увидеть полный путь символьной ссылки

128

Когда я использую ls -la symlinkNameили stat symlinkNameнет, отображается весь путь (например ../../../one/two/file.txt)

Какая команда linux показывает полный путь?

15412s
источник
4
Здесь следует быть осторожным: когда ls или stat не отображают абсолютный путь - ссылка не имеет абсолютного пути! Это особенно. это важно, когда устройство смонтировано, например, в другом контексте (например, если у вас есть что-то на компакт-диске или USB-накопителе или вы пытаетесь восстановить сломанный жесткий диск). Все упомянутые решения (realpath, readlink, ....) показывают только абсолютный путь в смонтированном контексте.
flolo

Ответы:

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 09
2
Этот вопрос был о Linux, вы все.
Ян Стэплтон Кордаско 09
27

realpath <path to the symlink file> должен сделать свое дело.

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

ароматизаторы unix -> ll symLinkName

OSX -> readlink symLinkName

Разница в том, что 1-й способ будет отображать путь символьной ссылки мигающим способом, а 2-й способ просто отобразит его на консоли.

Rupam
источник
Вопрос был задан специально для полного / абсолютного пути, а не относительного пути (../../file.txt). Оба эти ответа дадут относительный путь.
wisbucky
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
user3467349
источник
ls может сделать это без ссылки для чтения; просто используйте ls -l. Это также вообще не работает, пытается сделать это для всего в каталоге (без ссылок), и если ваш ls настроен на использование цветов, awk полностью ломается. просто используйтеfind . -maxdepth 1 -type l -ls | awk '{print $11 "\t" $12 "\t" $13}'
Hashbrown