如何找到文件所在的挂载点?
比如,我有一个文件,路径是这样的:
/media/my_mountpoint/path/to/file.txt
我有了完整的路径,现在想要获取:
/media/my_mountpoint
我该怎么做呢?最好是用Python来实现,而且不想使用外部的库或工具。(这两点都不是必须的。)
9 个回答
7
现在,我们在一些系统中,无法可靠地解析通过 UUID
或 LABEL
挂载的文件系统的内容,因为输出可能会包含一些复杂的内容,比如:
(...)
/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