如何找到文件所在的挂载点?

24 投票
9 回答
19753 浏览
提问于 2025-04-16 08:35

比如,我有一个文件,路径是这样的:

/media/my_mountpoint/path/to/file.txt

我有了完整的路径,现在想要获取:

/media/my_mountpoint

我该怎么做呢?最好是用Python来实现,而且不想使用外部的库或工具。(这两点都不是必须的。)

9 个回答

7

现在,我们在一些系统中,无法可靠地解析通过 UUIDLABEL 挂载的文件系统的内容,因为输出可能会包含一些复杂的内容,比如:

(...)
/dev/disk/by-uuid/00000000-0000-0000-0000-000000000000 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
(...)

所以我们需要一个更可靠的解决方案(比如,想想像上面那样“切割”路径的部分可能会导致什么后果,我们是否真的想要这样的结果)。

其中一个解决方案(顺便说一下,这个方案并不是在重新发明轮子)就是简单地使用 stat 命令来查找一个文件所在的挂载点,像这样:

$ stat --printf "%h:%m:%i\n" Talks
6:/media/lattes:461246

在上面的输出中,我们可以看到:

  • Talks 中的硬链接数量 (%h) 是 6
  • 挂载点 (%m) 是 /media/lattes
  • 它的 inode 编号 (%i) 是 461246。

顺便提一下,这里使用的是 GNU coreutils 中的 stat 版本,这意味着其他一些版本(比如 BSD 系统)可能默认没有这个功能(但你可以通过你喜欢的包管理器来安装它)。

7

因为Python不是必须的:

df "$filename" | awk 'NR==1 {next} {print $6; exit}'

NR==1 {next} 这段代码是用来跳过数据框(df)输出的表头行的。$6 是指挂载点的位置。exit 是为了确保我们只输出一行结果。

24

你可以使用 mount 命令,然后分析它的输出,找到与你的路径最长的公共前缀;或者使用 stat 系统调用来获取一个文件所在的设备,然后一路向上查找,直到找到不同的设备。

在 Python 中,可以这样使用 stat(这个代码没有测试,可能需要扩展来处理符号链接和一些特殊情况,比如联合挂载):

def find_mount_point(path):
    path = os.path.abspath(path)
    orig_dev = os.stat(path).st_dev

    while path != '/':
        dir = os.path.dirname(path)
        if os.stat(dir).st_dev != orig_dev:
            # we crossed the device border
            break
        path = dir
    return path

补充: 我刚刚才知道 os.path.ismount 这个函数。这大大简化了事情。

def find_mount_point(path):
    path = os.path.abspath(path)
    while not os.path.ismount(path):
        path = os.path.dirname(path)
    return path

撰写回答