如何使用 df 计算总磁盘空间?

如何使用 df 计算总磁盘空间?

如何修改df -h命令以添加以下命令的结果(换句话说,将它们全部添加在一起并返回结果)?

$ df -h | awk '{print $2}'
Size
5.8G
64G
93M
3.9G
12G
108G
16G
134G
3.7T
3.7T
6.0T

答案1

GNUdf可以自己进行总计,最近的版本(至少从 8.21 开始,不确定旧版本)允许您选择要输出的字段,因此:

$ df -h --output=size --total
 Size
 971M
 200M
  18G
 997M
 5.0M
 997M
  82M
  84M
  84M
 200M
  22G
$ df -h --output=size --total | awk 'END {print $1}'
22G

man df:

--output[=FIELD_LIST]
      use the output format defined by FIELD_LIST, or print all fields
      if FIELD_LIST is omitted.
--total
      elide  all entries insignificant to available space, and produce
      a grand total

答案2

人类可读的数字格式会造成妨碍,因此您首先需要有一致的输出。可移植的是,您可以使用-P选项以 1024 块为单位输出

df -P | awk 'NR>2{sum+=$2}END{print sum}'

如果您使用 GNU,df您可以指定--blocksize选项:

df --block-size=1  | awk 'NR>2{sum+=$2}END{print sum}'

NR>2部分是为了避免处理Size标题行。至于将数据格式化回人类可读的格式,如果您使用的是 Linux,则可以使用numfmt工具,否则 - 在awk.请参阅相关答案

另请注意,df输出所有文件系统的大小,包括虚拟文件系统,例如udevtmpfs。如果您只需要实际的物理磁盘,您可以考虑将其过滤掉。因此,如果我们仅考虑具有在文件系统中表示的设备文件的文件系统/dev/,您可能可以使用如下所示的内容:

df -P | awk 'NR>2 && /^\/dev\//{sum+=$2}END{print sum}'

对于 GNU,df您也可以考虑使用--local标志来忽略删除文件系统。

答案3

在某些情况下(即 btrfs),文件系统会在 df 中多次出现。所以更好的解决方案是

 df | awk '/dev\/sd/ {sums[$1]=$3} END {for (i in sums) tot += sums[i]; print tot}' | numfmt --to=iec

相关内容