【问题标题】:Show percentage of home directory usage in /在 / 中显示主目录使用百分比
【发布时间】:2025-11-21 19:10:01
【问题描述】:

我需要制作一个简单的 bash 脚本来显示主目录在所有根文件夹中所占的百分比。应该是这样的:

Root filesystem size: 238G
Home directory size: 125G
Home directory uses 52% of /

这是我目前写的代码:

#!/bin/bash
r=$(df -hm / | awk '{print $2}' | awk 'END{print}')
h=$(cd ~; du -hs | awk '{print $1}')
echo "Root filesystem size: $r"
echo "Home diectory size: $h"
#???
echo "Home directory uses ??? of /"

我不确定如何进行除法。我认为我应该使用bc 命令来完成这项工作。有什么帮助吗?

【问题讨论】:

  • 如果您使用du-h 选项,您将如何进行算术运算?如果 df 决定以 MB 为单位显示值,而 du 以其他方式显示它,那么您将比较 apple 和 pears。在两个命令中以相同的测量单位生成数字。

标签: bash shell


【解决方案1】:

首先以相同的单位获取两个大小,例如 1k 块,然后将它们传递给 bc 脚本。使用 bash、GNU bc 1.07.1 以及来自 GNU coreutils 8.32 的 dfdu 实用程序的示例:

$ declare -a tmp
$ tmp=( $(df -k --output=size /) )
$ r="${tmp[1]}"
$ tmp=( $(du -ks ~) )
$ h="${tmp[0]}"
$ p=$( bc <<< "scale=2; 100*$h/$r" )
$ echo "Root filesystem size: $r K"
Root filesystem size: 492126216 K
$ echo "Home directory size: $h K"
Home directory size: 15284497 K
$ echo "Home directory uses $p% of /"
Home directory uses 3.10% of /

注意:scale=2 语句定义了小数点后的位数(本例为 2,根据您的需要调整)。

【讨论】:

    【解决方案2】:

    肮脏的技巧是只做awk 并让它全部进行转换:

    echo "...$(awk '{printf "%.0f", $1/$2}' <<<"$r $h")% ..."
    

    正确的脚本将删除-h 并处理字节。使用numfmt 转换为人类可读的。使用 bash $((...)) 算术扩展进行计算。

    【讨论】:

      【解决方案3】:

      我相信你犯了一个错误,一个目录使用du -hs,根目录使用df ...:一切都在根目录中,但可能有不同的文件系统,这不会被计算在内使用df ...,因此我建议您:

      dir_usage=$(du -hs .)
      cd /
      root_usage=$(du -hs .)
      echo "Root root size: $root_usage"
      echo "Home directory size: $dir_usage"
      echo "Percentage: $(($dir_usage * 100 / $root_usage))"
      

      供您参考:$((x * 100 / y)) 是执行标准 UNIX 整数运算的方法。

      【讨论】: