Как получить полный путь исходного файла мягкой символьной ссылки?

Пакеты Debian могут включать установленный размер, но я не полагаю, что RPMs имеют эквивалентное поле. Это можно вычислить на основе файлов, включенных в пакет, но также и нельзя положиться из-за действий, которые могут быть приняты пред/сообщение сценарии установки.

Вот довольно хорошая ссылка для сравнения некоторых определенных функций, которые доступны для каждого определенного упаковочного формата: http://debian-br.sourceforge.net/txt/alien.htm (согласно веб-серверу, тот документ довольно стар: измененный в последний раз: Sun, 15 октября 2000 таким образом, это не могло бы быть лучшей ссылкой.)

103
11.12.2013, 13:42
10 ответов

Попробуйте эту строку:

readlink -f `which command`

Если command находится в Вашем $PATH переменная, иначе необходимо указать путь, который Вы знаете.

133
27.01.2020, 19:30
  • 1
    -f возвратит путь к несуществующей заключительной цели, пока цели промежуточного канала существуют... Использовать -e избегать этого, т.е. -e возвратит пустой указатель, если заключительная цель не будет существовать. –  Peter.O 06.10.2011, 07:31
  • 2
    -f с ошибками с readlink: illegal option -- f в OSX. Удаление его хорошо работало. –  Heath Borders 13.11.2013, 18:44
  • 3
    @HeathBorders Для OSX, если у Вас есть домашнее пиво coreutils, установил Вас, может также использовать greadlink вместо этого. –  Adam Gent 22.08.2016, 17:47

В соответствии с Linux, readlink читает содержание символьной ссылки, и readlink -f следует за символьными ссылками на символьные ссылки на символьные ссылки, и т.д., пока это не находит что-то, что не является символьной ссылкой.

Это не необходимо для scp хотя: scp всегда следует за символьными ссылками (он всегда копирует содержание файла, игнорируя метаданные за исключением того, что -p сохраняет времена файла и режимы когда возможный).

Если Вы находите себя разочарованными тем, какие метаданные scp могут и не могут сохранить, я предлагаю использовать rsync. Без опции rsync копирует содержание файла, игнорирующее метаданные. Наиболее часто используемая опция -a сохраняет все метаданные разнообразия сада (времена, символьные ссылки, полномочия и владение), и существуют опции сохранить экзотические метаданные как ACLs и жесткие ссылки.

24
27.01.2020, 19:30
  • 1
    readlink делает только одноэтапный для соединения чтения. например, в человечности у нас есть/bin/zsh, который является symlinked к/etc/alternatives/zsh, но это - вторая символьная ссылка. Наконец мы не получим реальный путь файла или каталога. То же с командой статистики. Только readlink с-f опцией делают всю твердость. –  Znik 23.03.2018, 11:52

Статистика даст Вам эту информацию:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...
6
27.01.2020, 19:30
  • 1
    readlink делает только одноэтапный для соединения чтения. например, в человечности у нас есть/bin/zsh, который является symlinked к/etc/alternatives/zsh, но это - вторая символьная ссылка. Наконец мы не получим реальный путь файла или каталога. То же с командой статистики. Только readlink с-f опцией делают всю твердость. –  Znik 23.03.2018, 11:53

Вы можете выполнить

readlink -f `which command`

или получить что-то подобное в Linux с помощью

stat `which command` | grep File

. Если вы добавляете это в сценарий, проверьте ошибку. Если вы не хотите видеть сообщение об ошибке в случае отсутствия символьной ссылки, используйте что-то вроде

readlink -f "`which command`" 
5
27.01.2020, 19:30

Я использую команду ls , stat , readlink .

В качестве примера возьмем файл / etc / localtime

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

Операция

Использование stat

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

Использование readlink

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

Похоже, эта команда ​​readlink -f лучше.

Объяснение

-f, --canonicalize: канонизировать, рекурсивно переходя по каждой символической ссылке в каждом компоненте данного имени; все компоненты, кроме последнего, должны существовать —— Из man readlink

9
27.01.2020, 19:30

Я бы использовал realpath .

Возможно, то, что вы называете "источником", является "целевым" файлом в соответствии с использованием ln: Использование: ln [OPTION]... [-T] TARGET LINK_NAME

3
27.01.2020, 19:30

readlink -f 'какая java'у меня не работает.

Но это сделало:

readlink -f $(which java)
0
27.01.2020, 19:30

На MAC OX параметр «-f» не работает, «readlink» работает без каких-либо параметров.

KZs-MacBook-Pro:bin kz$ readlink -f pip3
readlink: illegal option -- f
usage: readlink [-n] [file...]

KZs-MacBook-Pro:bin kz$ readlink pip3
../../../Library/Frameworks/Python.framework/Versions/3.7/bin/pip3
0
27.01.2020, 19:30

Ниже приводится полный путь, разрешающий символическую ссылку.

which [symlink] | xargs realpath
0
27.01.2020, 19:30

Для macOS Catalina попробуйте-

readlink -n `which command`
0
01.04.2021, 20:49

Теги

Похожие вопросы