在* nix中,如何确定特定文件位于哪个文件系统上?


12

在通用的现代unix环境中(例如,GNU / Linux,GNU / Solaris或Mac OS X),是否有很好的方法来确定特定绝对文件路径位于哪个挂载点和文件系统类型上?

我想我可以执行mount命令并手动解析该命令的输出,并将其与文件路径进行字符串比较,但是在此之前,我想知道是否还有更优雅的方法。

我正在开发一个利用扩展属性的BASH脚本,并希望使其适用于各种文件系统和主机环境(在可能的范围内)。

Answers:


19

该命令df(1)采用一个或多个参数,并将返回该文件或目录所在的安装点和设备以及使用信息。然后,您可以使用路径或设备在mount -v或类似输出中查找文件系统类型。

不幸的是,和的输出格式都dfmount系统有关;没有明显的标准,至少在Solaris,NetBSD和Mac OS X之间可以看到。


1
df -P应该在任何符合POSIX的系统上产生标准化的输出。一些傻瓜系统可能还需要设置一个神奇的环境变量,例如POSIXLY_CORRECT。
Dan Moulding

示例df /path-to-the-directory将为您提供该目录的包含分区
Hasanuzzaman Sattar

7

您可以使用stat。命令stat --printf'%d'filename.txt将以十六进制/十进制形式返回设备号。


那么,如何在此基础上查找设备名称?
雏菊

您需要浏览/ dev /中的所有设备文件,并查找一个与stat报告的次要编号相同的文件。
维斯拉夫先生

stat --printf "%d"确实告诉您设备的次要数量,但是要获取设备名称及其挂载的文件系统,还有更多工作要做。
Craig McQueen 2015年

2
也许这是最近添加的内容,但是stat --format '%m' $file它将为您stat --file-system --format '%T' $mount提供安装点,并提供文件系统类型名称。
roaima 2015年

1
@TomHale:老实说,不记得了。但是我记得那没有用。诚然,我应该说过发行版,内核版本等。但是您说它可行,也可能意味着它已经修复。如果最终结果是
可行的


2

嗯 对于安装点,您可以向上移动层次结构,直到st_dev更改(然后您刚刚越过了安装边界);statbash脚本有GNU ;但是,我不知道如何在不进行分析/proc/mounts或通过反复试验的情况下猜测文件系统类型(即,设置扩展属性后处理失败)


2

使用的一个陷阱df是,如果输出中的设备名称很长,则该行将自动换行,因此您不能只抓住最后一行。而是剥离第一行,然后抓住新的第一行,然后打印第一字段:

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3
通过使用'df -P'来获取POSIX格式的输出而无需换行,可以避免此问题。
MikeyB

2

在Linux上df和btrfs似乎有一个问题。当您要求df找到已安装的btrfs卷的安装点时,它将做正确的事情。在这种情况下,joe是/ m / whale / backup的子目录。

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

但是,如果所引用的目录是一个子卷,它将不再告诉您安装点。

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

根据内核,/ a / whale / backup是唯一的安装点。

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

FWIW,stat做同样的事情:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

/programming/2167558/give-the-mount-point-of-a-path

 df -P $path  | tail -1 | awk '{ print $NF}'

可以在我测试过的任何地方工作,无论是* BSD还是sysV,以及古怪的自动挂载目录。我很高兴听到它失败的情况。


1
建议的代码df -P $ path | 尾巴-1 | awk'{print $ NF}'在我尝试过的所有Solaris版本(2.5.1、8、9和10)上均失败,因为Solaris的“ df”不支持“ -P”选项。
彼得·约翰·阿克兰

@Peter:我没有我想的那么高兴。但是有趣的是,知道这个问题并不重要。我认为正确的做法是使用脚本语言编写命令,该脚本的库已正确解决了该问题,例如Python具有os.path.splitunc()函数,该函数提供了挂载点,并且我认为该函数可以在Solaris上运行。
查尔斯·斯图尔特

@CharlesStewart:可悲的是,据我所知,Python中没有这样的功能。os.path.splitunc()仅适用于UNC路径仅在Windows上可用
Aleksi Torhamo 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.