주어진 FILE을 포함하는 파일 시스템의 마운트 지점을 찾는 빠른 방법을 찾고 있습니다. 아래 솔루션보다 더 간단하거나 직접적인 것이 있습니까?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
비슷한 질문 " 디스크가 마운트 된 위치를 확인하는 명령이 있습니까? "는 디스크의 임의 파일이 아니라 현재 디스크의 장치 노드를 입력으로 사용합니다 ...
주어진 FILE을 포함하는 파일 시스템의 마운트 지점을 찾는 빠른 방법을 찾고 있습니다. 아래 솔루션보다 더 간단하거나 직접적인 것이 있습니까?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
비슷한 질문 " 디스크가 마운트 된 위치를 확인하는 명령이 있습니까? "는 디스크의 임의 파일이 아니라 현재 디스크의 장치 노드를 입력으로 사용합니다 ...
답변:
당신은 같은 것을 할 수 있습니다
df -P FILE | awk 'NR==2{print $NF}'
또는
df -P FILE | awk 'END{print $NF}'
때문에 awk
기본적으로 공백에 분할 (들), 당신은 지정할 필요가 없습니다 -F
당신은 또한에 공백을 트리밍 할 필요가 없습니다 tr
. 마지막으로 관심있는 줄 번호 ( NR==2
)를 지정하여을 (를 ) 제거 할 수도 있습니다 tail
.
-P
옳은 일 없이도 작동해야 합니까? 모든 경우에 가장 최근에 인쇄 된 필드 awk
는 디스크 여야합니다.
-P
Gilles가 추가 한 옵션을 사용하지 않았기 때문일 수 있습니다.
-P
입니다. 그럼에도 불구하고 -P
의 출력을 구문 분석 할 때 항상 사용하는 것이 좋습니다 df
.이 특정 사용이 안전한지 확인하는 것보다 쉽습니다.
mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
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
옵션을 선택합니다.
df
> = 8.21 의 기능이라고 설명합니다 .
Linux의 경우 util-linux에서 findmnt를 사용하여 정확하게 만들었습니다.
findmnt -n -o TARGET --target /path/to/FILE
바인드 마운트가 여러 개인 경우 임의의 임의의 마운트 포인트가 리턴 될 수 있습니다. 사용 df
에도 같은 문제가 있습니다.
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_dev
하나의 NFS 파티션을 다른 NFS 파티션과 구별하는 방법을 제공하지 않는 것 같습니다 . 실제로 이것을 쓰고 싶은 사람은 이것을 고려해야합니다;)
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();
}
프로그래밍 방식에 대한 추가 링크
tr
사용하여 전화awk -F'% '...