我正在开发一个用 bash 编写的小型实用工具,它可以为我提供有关 Linux 上游戏服务器的一些信息。因此,我需要能够显示文件内容的大小。
我现在用这个来做:
du -Lshc *
它几乎完美无缺!唯一的缺陷是它显示的内容如下:
21G backups
22G server
8.0K start.sh
151M world.zip
43G total
这没问题,但我想要更多数字。这意味着它应该看起来像这样:
21.587G backups
22.124G server
8.089K start.sh
151.198M world.zip
43.436G total
有可能这样做吗?
我不会介意使用复杂的命令,因为我在文件中使用它.sh
,所以我不会每次都手动输入它。
答案1
du -Lsbc * | awk '
function hr(bytes) {
hum[1024**4]="TiB";
hum[1024**3]="GiB";
hum[1024**2]="MiB";
hum[1024]="kiB";
for (x = 1024**4; x >= 1024; x /= 1024) {
if (bytes >= x) {
return sprintf("%8.3f %s", bytes/x, hum[x]);
}
}
return sprintf("%4d B", bytes);
}
{
print hr($1) "\t" $2
}
'
awk 函数基于这。
也许可以通过管道传输column
或在左侧填充空格来使输出看起来更美观一些。
编辑:添加了左填充。
另外,对列表进行排序:du -Lsbc * | sort -n | awk
然后是 awk 脚本。
答案2
这是我使用@n.st 代码的 bash 实现
hr() {
bytes=$1
hum[1024**4]="TiB";
hum[1024**3]="GiB";
hum[1024**2]="MiB";
hum[1024]="kiB";
x=0
for ((x = 1024**4; $x >= 1024; x = ($x/1024) ))
do
if [ "$bytes" -ge "$x" ]; then
$(printf "%8.3f %s" $( echo "$bytes $x" | awk '{printf "%.2f \n", $1/$2}' ) ${hum[$x]});
return 0;
fi
done
echo $(printf "%4d B" $bytes);
}
尝试
echo $(hr 1024);
echo $(hr 4096);
echo $(hr $((1024*500)) );
echo $(hr $((1024*8000)) );
echo $(hr $((1024*1024*500)) );
echo $(hr $((1024*1024*1024*500)) );
echo $(hr 2127780017);
输出
1.000 kiB
4.000 kiB
500.000 kiB
7.810 MiB
500.000 MiB
500.000 GiB
1.980 GiB