我正在寻找一种快速的方法来查找包含给定FILE的文件系统的挂载点。有什么比下面的解决方案更简单或更直接的方法吗?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
类似的问题“ 是否有命令可以查看磁盘的安装位置? ”使用当前磁盘的设备节点作为输入,而不是磁盘中的任意文件...
我正在寻找一种快速的方法来查找包含给定FILE的文件系统的挂载点。有什么比下面的解决方案更简单或更直接的方法吗?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
类似的问题“ 是否有命令可以查看磁盘的安装位置? ”使用当前磁盘的设备节点作为输入,而不是磁盘中的任意文件...
Answers:
你可以做类似的事情
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的功能。
由于stat
返回的是“设备”字段,因此我很想知道如何使用底层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 / Linux操作系统。
然后,您可以从(例如)获得设备主/次号与设备节点之间的对应关系/proc/diskstats
,并将其映射到/proc/mounts
aka中的挂载点。/etc/mtab
。
因此,执行此操作的命令行实用程序将非常简单。
/proc/diskstats
只为块设备,你会错过NFS,PROC,保险丝......在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'% '...