如何在Python中获取符号链接目标?

时间:2015-10-20 09:05:32

标签: python symlink

使用Python,我需要检查数百个符号链接是否正确,否则重新创建它们。我现在所做的是比较我想要的东西和我拥有的东西,但它很慢,因为它是通过NFS自动挂载的。

否则我将使用命令'ls -l'运行子进程并处理返回的字符串列表。我更喜欢使用Python库的更好的解决方案...

编辑1:我有:link_name -> link_target,然后是link_target -> a_real_file。我需要的是从link_target中提取link_name,而不是a_real_file。我不在乎真实文件是否存在。

编辑2:也许我没有正确表达。正确的符号链接的意思是'一个指向预定义路径的链接,即使它不存在'。所以我需要检查一下:

link_name_1 -> target_1
link_name_2 -> target_2

这就是为什么我需要提取目标,而不是真正的路径。然后我将它们与参考(字典)进行比较。所以我的问题是:如何提取目标路径?

4 个答案:

答案 0 :(得分:10)

您需要查看os.readlink()

答案 1 :(得分:2)

在Python 3.9或更高版本中,可以使用pathlib.Path.readlink()

>>> p = Path('mylink')
>>> p.symlink_to('setup.py')
>>> p.readlink()
PosixPath('setup.py')

答案 2 :(得分:0)

要确定目录条目是否为符号链接,请使用以下命令:

os.path.islink(path)

如果path引用作为符号链接的目录条目,则返回True。如果不支持符号链接,则始终为False。

答案 3 :(得分:0)

要确定链接是否已损坏,您可以os.walk和测试os.path.exists(path),对于损坏的链接,它将返回False。然后,您可以使用os.path.realpath(path)找出链接应该指向的内容 像(未经测试)的东西:

for root, dirs, files in os.walk('<path>'):
    for file in files:
         f = os.join(root, file)
         if os.path.islink(f) and not os.path.exist(f):
             print("Broken: {} -> {}".format(f, os.path.realpath(f)))