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

在一个通用的,现代的Unix环境(比如GNU / Linux,GNU / Solaris或者Mac OS X)中,是否有一种很好的方法来确定哪个安装点和文件系统types是一个特定的绝对文件path?

我想我可以执行mount命令并手动parsing输出和string – 将其与我的文件path比较,但在此之前,我想知道是否有一个更优雅的方式。

我正在开发一个使用扩展属性的BASH脚本,并且希望使其能够为各种文件系统和主机环境做正确的事情(在很小的程度上它是可能的)。

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

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

    你可以使用stat 。 命令stat –printf'%d'filename.txt将以hex/十进制forms返回设备号。

    就像一个特定的文件一样简单

     df -T "${FILE}" | awk '{print $2}' | tail -n1 

    嗯。 对于挂载点,您可以沿着层次结构上升,直到st_dev发生改变(然后您刚刚越过了挂载边界)。 有bash脚本的GNU stat ; 然而,我不知道如何猜测文件系统types,而不需要parsing/proc/mounts或者试错(即设置扩展属性后处理失败)

    使用df一个问题是,如果输出中的设备名称很长,那么行将包装,因此您不能只抓取最后一行。 而是剥离第一行,然后抓住新的第一行,然后打印第一个字段:

     #!/usr/bin/env bash path=$1 curdir=$(pwd) cd $path df . | tail -n +2 | head -1 | awk '{print $1}' cd $curdir 

    https://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path

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

    在我testing过的任何地方都可以运行* BSDs和sysVs以及古怪的自动安装目录。 我很高兴听到一个失败的例子。

    Linux上似乎有一个df和btrfs的问题。 当你问dffind挂载的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