주어진 파일을 포함하는 파일 시스템의 마운트 지점을 얻는 방법


13

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

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

비슷한 질문 " 디스크가 마운트 된 위치를 확인하는 명령이 있습니까? "는 디스크의 임의 파일이 아니라 현재 디스크의 장치 노드를 입력으로 사용합니다 ...


1
당신은 마지막으로 멀리 할 수있는 tr사용하여 전화awk -F'% '...
조셉 R.를

답변:


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

@Gilles, 편집 해 주셔서 감사합니다. 하나의 질문, 두 번째 질문은 -P옳은 일 없이도 작동해야 합니까? 모든 경우에 가장 최근에 인쇄 된 필드 awk는 디스크 여야합니다.
terdon

@Stu 아마도 -PGilles가 추가 한 옵션을 사용하지 않았기 때문일 수 있습니다.
terdon

1
@terdon 예, 실제로 마지막 줄의 마지막 필드는 -P입니다. 그럼에도 불구하고 -P의 출력을 구문 분석 할 때 항상 사용하는 것이 좋습니다 df.이 특정 사용이 안전한지 확인하는 것보다 쉽습니다.
Gilles 'SO- 악의를 멈춰라'

좋은. $ {FILE}에 대한 / dev 항목이 필요한 경우 (어떤 이유로 든)mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
동기화되지 않은

16

GNU / Linux stat에서 coreutils 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옵션을 선택합니다.
Joseph R.

@JosephR. 버전 8.21 이상입니까?
terdon

@terdon 아니요 버전 8.13입니다.
Joseph R.

2
@JosephR. 스테판은 그의 대답에서 이것이 GNU df> = 8.21 의 기능이라고 설명합니다 .
terdon

@terdon 스키밍하는 동안 죄송합니다.
Joseph R.

8

Linux의 경우 util-linux에서 findmnt를 사용하여 정확하게 만들었습니다.

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

바인드 마운트가 여러 개인 경우 임의의 임의의 마운트 포인트가 리턴 될 수 있습니다. 사용 df에도 같은 문제가 있습니다.


2
하위 볼륨에있는 파일에서도 올바르게 작동합니다.
ceremcem 2016 년

3

stat"Device"필드를 반환하기 때문에 기본 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 / 리눅스 외에 "다른 많은 시스템에 존재하는"있는 사람 페이지 주장하지만.

그런 다음, 예를 들어 장치 주 / 부 번호와 장치 노드 사이의 통신 관계를 가져 /proc/diskstats와서을 통해 지점을 마운트하도록 매핑 할 수 있습니다 /proc/mounts. /etc/mtab.

따라서이를 수행하는 명령 줄 유틸리티는 매우 간단합니다.


/proc/diskstats블록 장치 전용입니다. NFS, proc, fuse를 놓치게됩니다 ... Linux에서 적어도 다른 마운트 포인트는 같은 메이저 + 최소값을 가질 수 있습니다
Stéphane Chazelas

몰랐어요. 또한 st_dev하나의 NFS 파티션을 다른 NFS 파티션과 구별하는 방법을 제공하지 않는 것 같습니다 . 실제로 이것을 쓰고 싶은 사람은 이것을 고려해야합니다;)
goldilocks

OP 가하고있는 것보다 "단순하거나 직접적"인 C 코드를 작성한다고 생각하는 괴짜로 충분합니다. :).
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();
  }

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.