В Bash, как мне безопасно определить, на что указывает мягкая ссылка? - PullRequest
29 голосов
/ 18 июля 2010

Мне нужно обработать несколько каталогов, определить, какие файлы в них являются символическими ссылками и на что они ссылаются. Это звучит просто, но я не могу контролировать наличие управляющих или других символов в именах файлов, и мне нужно надежное решение.

Итак, учитывая файл с произвольным именем, как я могу безопасно определить, на что он ссылается, если в месте назначения ссылки также может быть произвольное содержимое?

Ответы [ 3 ]

47 голосов
/ 18 июля 2010

readlink -f <linkname>

См. man 1 readlink

1 голос
/ 31 октября 2018
stat <linkname>

Пример:

stat /usr/local/cuda

Первые 2 строки дадут:

File: '/usr/local/cuda' -> 'cuda-8.0'
Size: 8             Blocks: 0          IO Block: 4096   symbolic link
...
0 голосов
/ 09 мая 2019

Скрипт Python 2, который отслеживает / следует за символическими ссылками, представленными в качестве аргументов.

listSymLink.py

import os.path as OSPath
import os
import sys

for arg in sys.argv[1:]:
    if OSPath.exists(arg):
        pathTrail = [OSPath.abspath(arg)]
        while OSPath.islink(pathTrail[-1]):
            linkTarget = os.readlink(pathTrail[-1])
            if not OSPath.isabs(linkTarget):
                linkTarget = OSPath.join(os.path.dirname(pathTrail[-1]), linkTarget)
            pathTrail.append(linkTarget)
        print " -> ".join(map(lambda x: "\"" + x + "\"", pathTrail))
    else:
        print "\"" + arg + "\" path doesn't exist"

Пример

python listSymLink.py /usr/bin/c++

отпечатков

"/usr/bin/c++" -> "/etc/alternatives/c++" -> "/usr/bin/g++" -> "/usr/bin/g++-8" -> "/usr/bin/x86_64-linux-gnu-g++-8"
...