如何找到文件所在的挂载点?
- 2024-11-14 08:29:00
- admin 原创
- 16
问题描述:
例如,我有一个具有以下路径的文件:
/media/my_mountpoint/path/to/file.txt
我已经获得了完整的路径并想要获得:
/media/my_mountpoint
我该怎么做?最好使用 Python,并且不使用外部库/工具。(两者都不是必需的。)
解决方案 1:
您可以调用该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
解决方案 2:
由于 python 不是必需的:
df "$filename" | awk 'NR==1 {next} {print $6; exit}'
是NR==1 {next}
跳过 df 输出的标题行。$6
是挂载点。exit
是为了确保我们只输出一行。
解决方案 3:
由于现在我们无法真正可靠地解析由或mount
挂载文件系统的系统中的内容,因为输出可能包含类似以下内容: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
" Talks
6:/media/lattes:461246
在上面的输出中,我们可以看到:
中的硬链接数 (
%h
)Talks
为 6挂载点 (
%m
) 是/media/lattes
它的 inode 编号 (
%i
) 为 461246。
仅供参考,这是stat
来自 GNU coreutils的版本,这意味着某些其他版本(例如 BSD)可能默认没有它(但您始终可以使用您喜欢的包管理器安装它)。
解决方案 4:
@larsmans 非常好的回答,非常有帮助!我已经在需要的地方用 Golang 实现了它。
对于那些对代码感兴趣的人(这已经针对 OS X 和 Linux 进行了测试):
package main
import (
"os"
"fmt"
"syscall"
"path/filepath"
)
func Mountpoint(path string) string {
pi, err := os.Stat(path)
if err != nil {
return ""
}
odev := pi.Sys().(*syscall.Stat_t).Dev
for path != "/" {
_path := filepath.Dir(path)
in, err := os.Stat(_path)
if err != nil {
return ""
}
if odev != in.Sys().(*syscall.Stat_t).Dev {
break
}
path = _path
}
return path
}
func main() {
path, _ := filepath.Abs("./")
dir := filepath.Dir(path)
fmt.Println("Path", path)
fmt.Println("Dir", dir)
fmt.Println("Mountpoint", Mountpoint(path))
}
解决方案 5:
我正在用 Python 开发 GTK+ 3 文件管理器,在循环遍历文件时遇到了同样的需求。
我使用的计算机有 Linux 和 OS X 分区。当文件管理器应用程序(在 Linux 根分区上运行)尝试索引 OS X 分区上的文件时,它很快就会遇到从“/media/mac-hd/User Guides And Information”到“/Library/Documentation/User Guides and Information.localized”的绝对符号链接,然后就卡住了。问题是文件管理器在自己的文件系统上寻找该链接的绝对目标,而这个绝对目标并不存在,而不是在挂载在 /media/mac-hd 的 OS X 分区上。因此,我需要一种方法来识别文件位于不同的挂载点上,并将该挂载点添加到链接的绝对目标上。
我从Fred Foo的答案中编辑过的解决方案开始。它似乎有助于解决我试图解决的特定错误。当我调用时find_mount_point('/media/mac-hd/User Guides And Information')
,它会返回/media/mac-hd
。太好了,我想。
我注意到答案下方关于使其与符号链接一起工作的insecure的评论,并且还注意到他对 /var/run 的说法是正确的:
为了使您的代码与符号链接一起工作,例如 /var/run -> ../run,替换
os.path.abspath()
为os.path.realpath()
或find_mount_point()
将返回“/”。
当我尝试用 替换时os.path.abspath()
,我会得到os.path.realpath()
的正确返回值。但是我还注意到,由于现在返回 ,因此在调用时我将不再获得我想要的值。/run
`/var/runfind_mount_point('/media/mac-hd/User Guides And Information')
/`
以下是我最终使用的解决方案。也许可以简化:
def find_mount_point(path):
if not os.path.islink(path):
path = os.path.abspath(path)
elif os.path.islink(path) and os.path.lexists(os.readlink(path)):
path = os.path.realpath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
if os.path.islink(path) and os.path.lexists(os.readlink(path)):
path = os.path.realpath(path)
return path
解决方案 6:
我的 python 已经生疏了,不过你可以在 perl 中使用类似这样的命令:
export PATH_TO_LOOK_FOR="/media/path";
perl -ne '@p = split /s+/; print "$p[1]
" if "'$PATH_TO_LOOK_FOR'" =~ m@^$p[1]/@' < /proc/mounts
注意$PATH_TO_LOOK_FOR 周围的“ ' ' ”,否则它将不起作用。
//编辑:python 解决方案:
def find_mountpoint(path):
for l in open("/proc/mounts", "r"):
mp = l.split(" ")[1]
if(mp != "/" and path.find(mp)==0): return mp
return None
解决方案 7:
os.path.realpath
删除符号链接,因此更简洁:
def find_mountpoint(path):
"""Find the non-symlinked mountpoint of a path."""
path = os.path.realpath(path)
while not os.path.ismount(path):
path = os.path.dirname(path)
return path
解决方案 8:
/bin/mountpoint [-q] [-d] /path/to/directory
解决方案 9:
import os
def find_mount_point(path):
while not os.path.ismount(path):
path=os.path.dirname(path)
return path
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件