在通用的现代 unix 环境(例如,GNU/Linux、GNU/Solaris 或 Mac OS X)中,是否有一种好方法可以确定特定绝对文件路径所在的挂载点和文件系统类型?
我想我可以执行mount
命令并手动解析该命令的输出并将其与我的文件路径进行字符串比较,但在我这样做之前,我想知道是否有更优雅的方法。
我正在开发一个使用扩展属性的 BASH 脚本,并希望让它为各种文件系统和主机环境做正确的事情(在可能的小范围内)。
在通用的现代 unix 环境(例如,GNU/Linux、GNU/Solaris 或 Mac OS X)中,是否有一种好方法可以确定特定绝对文件路径所在的挂载点和文件系统类型?
我想我可以执行mount
命令并手动解析该命令的输出并将其与我的文件路径进行字符串比较,但在我这样做之前,我想知道是否有更优雅的方法。
我正在开发一个使用扩展属性的 BASH 脚本,并希望让它为各种文件系统和主机环境做正确的事情(在可能的小范围内)。
该命令
df(1)
采用一个或多个参数,并将返回该文件或目录所在的挂载点和设备,以及使用信息。mount -v
然后,您可以使用路径或设备在或类似的输出中查找文件系统类型。df
不幸的是,两者的输出格式都mount
依赖于系统;至少在 Solaris、NetBSD 和 Mac OS X 之间没有明显的标准。你可以使用stat。命令stat --printf '%d' filename.txt将以十六进制/十进制形式返回设备编号。
对于一个特定的文件,它就像
嗯。对于挂载点,您可以向上升级层次结构,直到 st_dev 更改(然后您刚刚越过了挂载边界);有用于 bash 脚本的 GNU
stat
;但是,我不知道如何在不解析/proc/mounts
或反复试验的情况下猜测文件系统类型(即在设置扩展属性后处理故障)using 的一个问题
df
是,如果输出中的设备名称很长,它将换行,因此您不能只抓住最后一行。而是剥离第一行,然后获取新的第一行,然后打印第一个字段:Linux 上的 df 和 btrfs 似乎有一个问题。当您要求 df 为已安装的 btrfs 卷定位安装点时,它会做正确的事情。在本例中,joe 是 /m/whale/backup 的子目录。
但是如果被引用的目录是一个子卷,它就不会再告诉你挂载点了。
根据内核,/a/whale/backup 是唯一的挂载点。
FWIW, stat 做同样的事情:
来自https://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path:
适用于我测试过的所有地方,对于 *BSDs 和 sysVs,以及古怪的自动挂载目录。我很高兴听到它失败的案例。