如何在Python中获取symlink目标?

2024-04-28 19:42:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

link_name_1 -> target_1
link_name_2 -> target_2

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


Tags: 字符串name命令路径target目标进程链接
3条回答

你需要看看^{}

os.readlink()的问题是它只能解决链接的一个步骤。我们可能会遇到这样的情况,即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.path.islink(path)

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

相关问题 更多 >