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

Geo*_*lly 16 python unix linux filesystems

例如,我有一个包含以下路径的文件:

/media/my_mountpoint/path/to/file.txt
Run Code Online (Sandbox Code Playgroud)

我有完整的道路,想要得到:

/media/my_mountpoint
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?最好是在Python中,不使用外部库/工具.(两者都不是必需的.)

Fre*_*Foo 18

您可以调用该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
Run Code Online (Sandbox Code Playgroud)

编辑: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
Run Code Online (Sandbox Code Playgroud)

  • 这几乎就是我现在正在使用的,除了我正在使用[`os.path.ismount()`](http://docs.python.org/library/os.path.html#os.path .ismount).我认为可能有一些比走路更直接的东西. (3认同)
  • 要使代码与符号链接一起工作,例如/ var/run - > ../run,将`os.path.abspath()`替换为`os.path.realpath()`或`find_mount_point()`将返回"/ ". (3认同)
  • @Georg:我甚至都不知道这个功能.我编辑了我的答案. (2认同)

rbr*_*ito 7

由于现在我们无法真正可靠地解析由或mount挂载文件系统的系统中的内容,因为输出可能包含以下内容:UUIDLABEL

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

我们需要一个更强大的解决方案(例如,考虑像上面这样的路径的“切割”部分可能会导致什么,以及我们是否想要类似的东西)。

一种这样的解决方案(顺便说一句,尽量不要重新发明轮子)是简单地使用命令stat来发现文件所在的挂载点,如下所示:

$ stat --printf "%h:%m:%i\n" Talks
6:/media/lattes:461246
Run Code Online (Sandbox Code Playgroud)

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

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

仅供记录,这是来自statGNU coreutils的版本,这意味着某些其他版本(例如 BSD)默认情况下可能没有它(但您始终可以使用您首选的包管理器安装它)。


cam*_*amh 5

因为python不是必需的:

df "$filename" | awk 'NR==1 {next} {print $6; exit}'
Run Code Online (Sandbox Code Playgroud)

NR==1 {next}是跳过df,可以输出标题行.$6是挂载点.exit是为了确保我们只输出一行.

  • 对于 Gentoo 上的我来说,只有在额外使用“-P”标志进行 posix 兼容输出时才有效。对于常规输出,如果路径太长并且所有其他列值都位于下一行,则文件系统列位于其自己的行上。 (2认同)