Bash-将变量转换为人类可读格式(KB,MB,GB)

时间:2015-07-22 17:11:35

标签: bash unix

在我的bash脚本中,我运行一个目录列表,并使用du命令将每个目录的大小读入变量。我还保持目录总大小的总计。唯一的问题是,在我得到总大小后,它是一种不可读的格式(例如64827120)。如何将包含此数字的变量转换为GB,MB等?

3 个答案:

答案 0 :(得分:2)

您希望使用du -h,它为您提供“人类可读”的输出,即KB,MB,GB等。

答案 1 :(得分:0)

尝试使用du -sh获取人类可读的总结大小,也可以在手册中找到与命令相关的帮助。
尝试以下命令,它将为您提供人类可读格式的大小

 du | tail -1 | awk {'print $1'} | awk '{ total = $1 / 1024 ; print total "MB" }'

 du | tail -1 | awk {'print $1'} | awk '{ total = $1 / 1024/1024 ; print total "GB" }'

答案 2 :(得分:0)

这是@Mahattam响应和我组合的其他响应的组合,以标准格式计算总量,然后以人类可读的格式设置输出。

XXX

Example of how it looks

它如何工作。

这可能是您要遍历路径列表的任何内容,但在此示例中,仅使用/ etc / pass遍历用户路径source is here for path in $(awk -F: '{if ($3 >= 1000) print $6}' < /etc/passwd); do disk_usage=0; disk_usage=$(du -s ${path} | grep -oE '[[:digit:]]+'); echo "$path: $(echo $disk_usage | tail -1 | awk {'print $1'} | awk '{ total = $1 / 1024/1024 ; printf("%.2fGB\n", total) }')"; myAssociativeArray[${path}]=${disk_usage}; done ; total=$(IFS=+; echo "$((${myAssociativeArray[*]}))"); echo "Total disk usage: $(echo $total | tail -1 | awk {'print $1'} | awk '{ total = $1 / 1024/1024 ; printf("%.2fGB\n", total) }')"; unset total; unset disk_usage ;

然后它计算每个文件夹的使用情况,并仅从循环中的输出中提取数字 for path in $(awk -F: '{if ($3 >= 1000) print $6}' < /etc/passwd)

它输出的格式很好,四舍五入到小数点后两位 disk_usage=0; disk_usage=$(du -s ${path} | grep -oE '[[:digit:]]+')

将此添加到bash关联数组 echo "$path: $(echo $disk_usage | tail -1 | awk {'print $1'} | awk '{ total = $1 / 1024/1024 ; printf("%.2fGB\n", total) }')";

然后将来自数组的原始值的总和 myAssociativeArray[${path}]=${disk_usage}

然后我们使用相同的奇特输出格式很好地展示了这一点 total=$(IFS=+; echo "$((${myAssociativeArray[*]}))")

在下面的怪兽oneliner中,我使用了这种变化来计算cPanel经销商帐户的磁盘使用情况。

echo "Total disk usage: $(echo $total | tail -1 | awk {'print $1'} | awk '{ total = $1 / 1024/1024 ; printf("%.2fGB\n", total) }')";

Example of the cPanel Reseller disk usage