繁体   English   中英

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

[英]How to get symlink target in Python?

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

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

Edit1:我有: link_name -> link_target然后link_target -> a_real_file 我需要的是提取link_targetlink_name ,不a_real_file 我不在乎真实文件是否存在。

Edit2:可能我表达的不正确。 所说的正确符号链接是“指向预定义路径的链接,即使它不存在”。 所以我需要检查一下:

link_name_1 -> target_1
link_name_2 -> target_2

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

os.readlink()的问题是它只能解析链接的 1 步。 我们可能会遇到A链接到另一个链接B ,而B链接悬空的情况。

$ ln -s /tmp/example/notexist /tmp/example/B
$ ln -s /tmp/example/B /tmp/example/A
$ ls -l /tmp/example
A -> /tmp/example/B
B -> /tmp/example/notexist

现在在 Python 中, os.readlink为您提供了第一个目标。

>>> import os
>>> os.readlink('A')
'/tmp/example/B'

但在大多数情况下,我认为我们对已解决的路径感兴趣。 所以pathlib可以在这里提供帮助:

>>> from pathlib import Path
>>> Path('A').resolve()
PosixPath('/tmp/example/notexist')

对于较旧的 Python 版本:

>>> os.path.realpath('A')
'/tmp/example/notexist'

您需要查看os.readlink()

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

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

要确定链接是否已损坏,您可以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.exists(f):
             print("Broken: {} -> {}".format(f, os.path.realpath(f)))

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

os.path.islink(路径)

如果路径指的是作为符号链接的目录条目,则返回 True。 如果不支持符号链接,则始终为 False。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM