在我的bash脚本中,我运行一个目录列表,并使用du命令将每个目录的大小读入变量。我还保持目录总大小的总计。唯一的问题是,在我得到总大小后,它是一种不可读的格式(例如64827120)。如何将包含此数字的变量转换为GB,MB等?
答案 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
它如何工作。
这可能是您要遍历路径列表的任何内容,但在此示例中,仅使用/ 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) }')";