首页 > 解决方案 > 如何获取给定磁盘 ID 的磁盘名称?

问题描述

系统stat调用 ( man 2 stat) 返回包含文件的设备的 ID。

在脚本中,可以通过以下方式获取此 ID

perl -e 'print((stat "/tmp/blah.txt")[0])'

给定 ID,如何获取磁盘的名称,例如/dev/sda2or /dev/disk1s1

我想在脚本(bash、perl 等)中最好以可移植的方式执行它,以便它在 MacOS 和 Linux 上都能可靠地工作。

标签: bashmacosfilesystemsdiskstat

解决方案


您可以使用“df”枚举文件系统,并在设备 ID 和磁盘之间创建映射。回想一下,每个 df 行都会在第一列列出挂载点(/dev/sda1,...),在第五列列出挂载点)。

以下脚本对地图使用 bash 关联数组,并使用 stat -c '%d' 提取给定路径的 'dev' 值。

# Create map dev2fs
function file2dev {
   stat -c '%d' "$1"
# If needed, use Perl equivalent
#    perl -e 'print ((stat($ARGV[0]))[0])' "$1"
}

declare -A dev2fs
while read fs size used available use mount ; do
    id=$(file2dev $mount);
    [ "$id" ] &&  dev2fs[$id]=$fs
done <<< "$(df)"

# Map a file to device
dev=$(file2dev /path/to/file );
echo "Device=${dev2fs[$dev]}"

此外,可以使用“mount -l”来遍历已挂载的文件系统。我不确定 MacOS 上存在哪一个。


推荐阅读