나는 주어진 파일을 포함하는 파일 시스템의 마운트 지점을 찾는 빠른 방법을 찾고 있습니다. 아래 솔루션보다 더 간단하고 간단한 것이 있습니까?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
유제"디스크 마운트 위치를 확인하는 명령어가 있나요?"디스크의 임의 파일이 아닌 현재 디스크의 장치 노드를 입력으로 사용합니다...
답변1
stat
GNU/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
지정하지 않아도 됩니다 . 마지막으로 관심 행 번호( )를 지정하여 취소할 수도 있습니다 .-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();
}
프로그래밍 방법에 대한 추가 링크