Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 2

stat <linkname>

Пример:

stat /usr/local/cuda

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

File: '/usr/local/cuda' -> 'cuda-8.0'
Size: 8             Blocks: 0          IO Block: 4096   symbolic link
...

Ответ 3

Скрипт 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"