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

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

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

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

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

答案1

在 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

答案2

对于 Linux,我们有来自 util-linux 的 findmnt 正是为此而制作的

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

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

答案3

你可以做类似的事情

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

甚至

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

由于awk默认情况下按空格分割,因此您不需要指定-F,也不需要使用 修剪空格tr。最后,通过指定感兴趣的行号 ( NR==2),您还可以取消tail.

答案4

如果您想从 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();
  }

有关编程方式的更多链接

相关内容