python - 如果路径是指向另一个路径的符号链接(symbolic link)

标签 python filesystems symlink

Python 中有没有一种方法可以检查一个文件是否是另一个特定文件的符号链接(symbolic link)?例如,如果 /home/user/x 符号链接(symbolic link)到 /home/user/z,但 /home/user/y 链接到其他地方:

>>>print(isLink("/home/user/x", "/home/user/z"))
True
>>>print(isLink("/home/user/y", "/home/user/z"))
False
>>>print(isLink("/home/user/z", "/home/user/z"))
False

(/home/user/z 是原始文件,不是符号链接(symbolic link))

最佳答案

import os
def isLink(a, b):
    return os.path.islink(a) and os.path.realpath(a) == os.path.realpath(b)

请注意,这会将第二个参数解析为真实路径。因此,如果 ab 都是符号链接(symbolic link),只要它们都指向相同的真实路径,它就会返回 True。如果你不希望b被解析为真实路径,那么改变

os.path.realpath(a) == os.path.realpath(b)

os.path.realpath(a) == os.path.abspath(b)

现在如果a指向bb指向c,你想要 isLink(a, b) 仍然为 True,那么您需要使用 os.readlink(a) 而不是 os.path.realpath(a):

def isLink(a, b):
    return os.path.islink(a) and os.path.abspath(os.readlink(a)) == os.path.abspath(b)

os.readlink(a) 评估为 b,即 a 指向的下一个链接,而os.path.realpath(a) 的计算结果为 c,即 a 指向的最终路径


例如,

In [129]: !touch z

In [130]: !ln -s z x

In [131]: !touch w

In [132]: !ln -s w y

In [138]: isLink('x', 'z')
Out[138]: True

In [139]: isLink('y', 'z')
Out[139]: False

In [140]: isLink('z', 'z')
Out[140]: False

关于python - 如果路径是指向另一个路径的符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17889368/

相关文章:

sqlite - 符号链接(symbolic link)在 Docker 镜像中丢失

python - 计算 Pandas 中公共(public)元素的出现次数

ruby - 如何使用 Ruby listen gem 监控单个文件?

python - 我可以加快嵌套 async/await aiohttp 代码的速度吗?

linux - jffs2 Linux 文件系统上的 O_DIRECT 支持

php - 是否有任何 PHP OO 文件 API?

php - 从同一个脚本运行多个网站

python - 使用符号链接(symbolic link)在 Linux 中导入 python 模块的简单方法

python - 如何获取html表中每一行的特定列的值?

python - 如何从密集的 Pandas 数据帧中制作完整的矩阵