【问题标题】:How to obtain the name of the disk given the disk ID?如何获取给定磁盘 ID 的磁盘名称?
【发布时间】:2020-03-01 02:35:39
【问题描述】:

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

在脚本中,这个 ID 可以通过,比如说

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

给定ID,如何获取磁盘名称,如/dev/sda2/dev/disk1s1

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

【问题讨论】:

  • warn 的用法很有趣。为什么不print?射击,为什么 perl 而不是 stat(1): stat -c '%d' /tmp
  • @Shawn 可移植性可能吗? macos有stat吗?
  • @ogizismail stat 不是 posix 命令吗?而且我记得看到一些关于苹果如何从操作系统中删除脚本语言的事情......
  • @Shawn 不,不是,它带有 GNU coreutils。您可以搜索标准here从操作系统中删除脚本语言真的吗?

标签: bash macos filesystems disk stat


【解决方案1】:

您可以使用“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 上存在哪一个。

【讨论】:

  • 通过阅读这个脚本,我学到了很多东西——这里是字符串、关联数组等。上次阅读 bash 手册时,这些都没有:)
【解决方案2】:

我认为您正在尝试重新发明轮子。
给定一个文件名,它所属的文件系统名称可以在df 输出的最后一行的第一列中找到。例如:

df -P /tmp | awk 'END { print $1 }'

【讨论】:

  • 漂亮而简单,但只能在 Linux 下工作。在 BSD/MacOS 下,df ~/.bashrc 产生与df 相同的输出。
  • 好吧,它确实适用于-P。 (即使手册页说它应该做其他事情:使用(默认)512 字节块。这仅作为从环境中覆盖 BLOCKSIZE 规范的一种方式有用。)跨度>
  • 我从规范中收集到的是 -P 用于生成可移植的输出,尽管 Linux 和 BSD 手册页都没有提到这一点
  • 好想知道-P,+1
猜你喜欢
  • 2020-03-31
  • 2019-03-11
  • 2012-08-27
  • 2015-11-20
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多