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

Я хочу scp файл на сервер. Файл является символической ссылкой, и на самом деле то, что я хочу сделать, это копирование исходного файла. Во всяком случае, я не хочу отслеживать путь исходного файла вручную, потому что его можно заменить. Если я могу получить абсолютный путь к исходному файлу, я могу sep с ним. Как я могу получить путь?

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

 readlink -f `which command` 

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

В Linux, readlink считывает содержимое символической ссылки, а readlink -f следует символическим ссылкам на символические ссылки на символические ссылки и т. Д., Пока не найдет что-то, что не является символической ссылкой.

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

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

Stat предоставит вам следующую информацию:

 $ stat current File: `current' -> `/home/user/releases/build/' ... 

Вы можете либо сделать

 readlink -f `which command` 

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

 stat `which command` | grep File 

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

 readlink -f "`which command`" 

Я использую команду 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 и [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: canonicalize, следуя каждой символической ссылке в каждом компоненте данного имени рекурсивно; все, кроме последнего компонента должны существовать – от man readlink

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

Вероятно, вы называете «источник» файлом «target» в соответствии с использованием ln : Usage: ln [OPTION]... [-T] TARGET LINK_NAME

readlink -f 'which java' не работал для меня.

Но это произошло:

 readlink -f $(which java)