특정 파일이 포함된 파일 시스템의 마운트 지점을 얻는 방법

특정 파일이 포함된 파일 시스템의 마운트 지점을 얻는 방법

나는 주어진 파일을 포함하는 파일 시스템의 마운트 지점을 찾는 빠른 방법을 찾고 있습니다. 아래 솔루션보다 더 간단하고 간단한 것이 있습니까?

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

유제"디스크 마운트 위치를 확인하는 명령어가 있나요?"디스크의 임의 파일이 아닌 현재 디스크의 장치 노드를 입력으로 사용합니다...

답변1

statGNU/Linux에서 GNU coreutils 8.6 이상이 있는 경우 다음을 수행할 수 있습니다.

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"
}

귀하의 접근 방식은 유효하지만 마운트 지점에 공백, %, 줄 바꿈 또는 기타 인쇄할 수 없는 문자가 포함되어 있지 않다고 가정하면 df최신 버전의 GNU(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지정하지 않아도 됩니다 . 마지막으로 관심 행 번호( )를 지정하여 취소할 수도 있습니다 .-FtrNR==2tail

답변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();
  }

프로그래밍 방법에 대한 추가 링크

관련 정보