如何以 KB、MB、GB 而不是 K、M、G 格式打印人类可读格式?

如何以 KB、MB、GB 而不是 K、M、G 格式打印人类可读格式?

我的桌面上有一个小部件,它显示“垃圾箱”中文件的当前大小。小部件的代码如下:

du -ch ~/.Trash | grep total | cut -c 1-5

这会给我类似的东西:“99M”。但我想显示“99 MB”(分别为 KB、GB)。您能否帮我用正确的字符串替换代码以获得此结果(另请注意“99”和“MB”之间的空格)?提前致谢!

PS:我使用Mac OS X 10.11.6。

答案1

使用-s( --summarize) 选项仅显示总大小值:

du -sh | sed 's/^\([0-9]*\)\([^B]\).*/\1 \2B/'
  • ([0-9]*\)- 捕获总大小值

  • ([^B]\)- 捕获单位缩短值,除了B(字节,保持原样)

答案2

您可以使用 tr 清除尾随空格,并将“B”将其包裹在 echo 命令中:

echo "$(du -ch ~ | grep total | cut -c 1-5 | tr -d '[:blank:]')B" | sed 's/\(K\|M\|G\)B/ \1B/'

要不就sed它 :)

du -ch ~ | grep total | cut -c 1-5 | sed 's/\s\+$/B/' | sed 's/\(K\|M\|G\)B/ \1B/'

编辑0: 没有注意到单元之前的空间,最后添加了 sed 来完成这项工作

答案3

  1. 我发现,当大小在 10 K 到 99 K 之间(例如 42 K)时,输出的前五个字符是

            4    2    K    (标签)    /

    (假设路径名参数以/— 开头,如果您指定以 开头的参数,那么就会如此~)。这将是cut -c 1-5:的输出42K     /。 (我认为nnM和都会有同样的问题。)使用来获得第一个nnG 更有意义cut -f1场地输出的字符,而不是前五个字符。

  2. 如果您的目录名称包含单词 ,会发生什么情况total?提示:它将通过grep.与其df为每个子目录生成数据然后将grep其丢弃,不如df只生成总数更有意义。作为罗曼·佩雷克雷斯特指出,您可以通过指定-s选项来做到这一点。
  3. 作为dmgnx 指出,一旦您获得了号码(以K,M或结尾G),您所需要做的就是附加B.所以我的复合解决方案是

    echo "$(du -sh ~/.Trash | cut -f1)B"
    
  4. 哎呀!我没有注意到您想在数字和单位之间添加空格。好的,那么你确实需要sed(或类似的东西):

    du -sh ~/.Trash | cut -f1 | sed 's/[KMG]$/ &B/'
    

    或者也许只是

    du -sh ~/.Trash | sed 's/^\([0-9.]*\)\([KMG]\).*$/\1 \2B/'
    

    (用于sed丢弃目录名称,并cut完全消除)。

答案4

强行蛮横:

du -ch ~/.Trash | grep total | cut -c 1-5 | 
  sed -e 's/K$/ KB/; s/M$/ MB/; s/G$/ GB/'

相关内容