如何获取包含给定文件的文件系统的挂载点


13

我正在寻找一种快速的方法来查找包含给定FILE的文件系统的挂载点。有什么比下面的解决方案更简单或更直接的方法吗?

df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '

类似的问题“ 是否有命令可以查看磁盘的安装位置? ”使用当前磁盘的设备节点作为输入,而不是磁盘中的任意文件...


1
您可以tr使用awk -F'% '...
约瑟夫·R

Answers:


6

你可以做类似的事情

df -P FILE | awk 'NR==2{print $NF}'

甚至

df -P FILE | awk 'END{print $NF}'

由于awk默认情况下会在空白处进行分割,因此您无需指定-F,也无需使用来修剪空白tr。最后,通过指定关注的行号(NR==2),您也可以取消tail


第二个咒语开箱即用,而我必须在第一个将2更改为3。整洁
Stu 2013年

@Gilles,谢谢您的编辑。一个问题,第二个问题即使没有-P权利也应该起作用 ?在所有情况下,最后一个打印字段awk应该是磁盘。
terdon

@Stu可能是因为我没有使用-PGilles刚刚添加的选项。
terdon

1
@terdon是的,确实,最后一行的最后一个字段不带相同-P。尽管如此,我还是建议-P您在解析的输出时始终使用df,这比检查此特定用途是否安全容易。
吉尔斯(Gillles)“所以-别再邪恶了”

很好 如果您现在需要$ {FILE}的/ dev条目(由于某种原因)mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
不同步,2016年

16

在GNU / Linux上,如果您具有statcoreutils 8.6或更高版本的GNU,则可以执行以下操作:

stat -c %m -- "$file"

除此以外:

mount_point_of() {
  f=$(readlink -e -- "$1") &&
    until mountpoint -q -- "$f"; do
      f=${f%/*}; f=${f:-/}
    done &&
    printf '%s\n' "$f"
}

您的方法是有效的,但假设安装点不包含空格,%,换行符或其他不可打印的字符,则可以使用较新版本的GNU df(8.21或更高版本)对其进行稍微简化:

df --output=target FILE | tail -n +2

df--output选项无法识别。
约瑟夫R.13年

@JosephR。是8.21或更高版本?
terdon

@terdon不,它是版本8.13。
Joseph R.

2
@JosephR。Stephane在回答中解释说,这是GNU df> = 8.21的功能。
terdon

@terdon对不起,在浏览时一定错过了它。
约瑟夫R.13年

8

对于Linux,我们可以从util-linux中找到专门为此目的找到的东西

findmnt -n -o TARGET --target /path/to/FILE

请注意,如果有多个绑定安装,则可能会返回某种随机安装点。使用df具有相同的问题。


2
即使与子卷中的文件一起正常工作。
ceremcem

3

由于stat返回的是“设备”字段,因此我很想知道如何使用底层stat()库调用以符合POSIX的方式以编程方式获取此信息。

这个C代码片段:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main (int argc, const char *argv[]) {
    struct stat info;
    stat(argv[1], &info);
    printf("min: %d maj: %d\n",
        minor(info.st_dev),
        major(info.st_dev)
    );

    return 0;
}  

将为包含命令行(argv[1])上列出的文件的设备提供主要和次要设备ID 。遗憾的是,major()minor()没有POSIX,虽然手册页声称他们是“存在于许多其他系统”除了GNU / Linux操作系统。

然后,您可以从(例如)获得设备主/次号与设备节点之间的对应关系/proc/diskstats,并将其映射到/proc/mountsaka中的挂载点。/etc/mtab

因此,执行此操作的命令行实用程序将非常简单。


/proc/diskstats只为块设备,你会错过NFS,PROC,保险丝......在Linux上至少,不同的安装点可以有相同的少校+分钟
斯特凡Chazelas

不知道,谢谢。似乎st_dev也无法提供一种将一个NFS分区与另一个NFS分区区分开的方法。真正想写这篇文章的人必须考虑到这一点;)
goldilocks 2013年

+1足以使您认为您写的C代码比OP所进行的操作“简单或更直接” :)。
terdon

0

如果您想从C ++中执行此操作,请参阅以下更多C ++代码...

  #include <boost/filesystem.hpp>
  #include <sys/stat.h>

  /// returns true if the path is a mount point
  bool Stat::IsMount(const std::string& path)
  {

      if (path == "") return false;
      if (path == "/") return true;

      boost::filesystem::path path2(path);
      auto parent = path2.parent_path();

      struct stat sb_path;
      if (lstat(path.c_str(), &sb_path) == -1) return false; // path does not exist
      if (!S_ISDIR(sb_path.st_mode)) return false; // path is not a directory

      struct stat sb_parent;
      if (lstat(parent.string().c_str(), &sb_parent) == -1 ) return false; // parent does not exist

      if (sb_path.st_dev == sb_parent.st_dev) return false; // parent and child have same device id

      return true;

  }

  /// returns the path to the mount point that contains the path
  std::string Stat::MountPoint(const std::string& path0)
  {
      // first find the first "real" part of the path, because this file may not exist yet
      boost::filesystem::path path(path0);
      while(!boost::filesystem::exists(path) )
      {
          path = path.parent_path();
      }

      // then look for the mount point
      path = boost::filesystem::canonical(path);
      while(! IsMount(path.string()) )
      {
          path = path.parent_path();
      }

      return path.string();
  }

更多有关编程方式的链接

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.