在 unix 中查找可用磁盘空间,无需解析“df”输出

在 unix 中查找可用磁盘空间,无需解析“df”输出

当我输入时df -k .,我得到以下输出

Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       16512936 8650196   7023932  56% /

我所做的是尾随最后一行并提取第四个字段以获得正确的结果。

但是如果文件系统名称很长,例如/dev/niraj-asdsdsd-dsdsdsa,则df在新行上打印更多详细信息,并使用我的逻辑得到56%代替7023932

所以我的问题是,如何在任何情况下确定确切的可用空间?

答案1

stat实用程序可方便获取文件统计信息,还可以为您提供有关文件系统的信息,只需提供选项即可-f

但请确保您提供的是挂载点(例如/boot),而不是设备文件(/dev/sda1)!因为在后一种情况下stat将报告/dev文件系统的统计信息,而文件系统(在 Debian 上)是虚拟文件系统,与物理磁盘无关:

$ mount | grep sda1
/dev/sda1 在 /boot 类型 ext2 上 (rw,relatime,errors=continue,user_xattr,acl)
$ env stat -f /dev/sda2
 文件:“/dev/sda1”
    ID:0 名称长度:255 类型:tmpfs
区块大小:4096 基本区块大小:4096
区块:总计:2560 空闲:2560 可用:2560
Inode:总计:497355 可用:496852
$ 环境统计 -f /启动
  文件:“/boot”
    ID:fe082d7c0c42ea6f 名称长度:255 类型:ext2/ext3
区块大小:1024 基本区块大小:1024
区块:总计:99150 空闲:52490 可用:47370
Inode:总计:25688 空闲:25355
  • 之间的区别自由的可用的计数结果从保留块
  • 我曾经env确保没有使用你的 shell 的内置 stat 命令(它可能提供也可能不提供所有使用的选项)。

因此,要回答您的问题,您可以使用自定义的(-c)统计输出格式来获取可用空间(%a/

$ env stat -f -c %a /
1711744

%S/1024这是以块为单位的,所以要聪明一点,让系统通过将输出导入计算器,以 KB 为单位与块大小相乘( ) bc

$ env stat -f -c '%a*%S/1024' / | bc
6846976

让我们检查一下df

$ df /
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda2       25066604 16939628   6846976  72% /

很好,报告的数字相同!

答案2

非常感谢,我在使用 df 时遇到了问题,因为根据系统的不同,它会得到第 3 或第 4 列,这样我就解决了!我正在开发一个 bash 脚本来检查各种系统上 /、/boot 和 /var 上的可用空间,如果少于一定数量的 MB,则发送报告。

我已将其转换为 MB,因为我发现只需添加另一个分区,它就更容易阅读

echo $(env stat -f -c '%a*%S/1024/1024' /boot | bc)MB free on /boot

答案3

Niraj - 您看过 di 实用程序吗?这可能至少提供了一种更简单的方法来提取您需要的数据,它提供了驱动器空间的 CSV 格式输出。

di -c

答案4

要以 Kb 或 Mb 为单位显示可用磁盘空间,可以使用以下命令:

export LC_NUMERIC="en_ZA.utf8" && free_disk_space_before=$(env stat -f -c '%a*%S/1024' / | bc) && echo "Free Disk Space:" $(/usr/bin/printf "%'3.3f" ${free_disk_space_before}) "Kb"

export LC_NUMERIC="en_ZA.utf8" && free_disk_space_before=$(env stat -f -c '%a*%S/1024/1024' / | bc) && echo "Free Disk Space:" $(/usr/bin/printf "%'d" ${free_disk_space_before}) "Mb"

结果如下:

Free Disk Space: 874,064 Kb
Free Disk Space: 874 Mb

转换为 en_ZA.utf8 只是获取千位之间的逗号的一种方法。

相关内容