千字节到人类可读.寻找一个班轮

use*_*723 2 perl awk sed sh du

我经常在没有-h标志的unix盒子上工作.

我正在寻找一个单行转换KB转换为人类可读.Perl似乎是个不错的选择.
这就是我到目前为止所拥有的.

@a=split /\s+/;
$x=$_!=0?int(log()/log(1024)):0;
@b=('K','M','G');
printf("%.3s%s\t%s\n",$_/(1024)**$x,$b[$x],$a[1]);
Run Code Online (Sandbox Code Playgroud)

像这样运行:

du -ks * | perl -lne '@a=split /\s+/;$x=$_!=0?int(log()/log(1024)):0;@b=('K','M','G');printf("%.3s%s\t%s\n",$_/(1024)**$x,$b[$x],$a[1]);'
Run Code Online (Sandbox Code Playgroud)

它无法正常工作,因为我无法找到正确的printf格式.

使用perl以及awk/sed等的单行将是最有用的.

这就是du -h的样子.最大1位小数.最小值:0位小数.随着舍入.

8.0K
1.7M
4.0M
5.7M
88K
Run Code Online (Sandbox Code Playgroud)

更新:

du -ks * | perl -lane '$F[0];$x=$_!=?int(log()/log(1024)):0;printf("%.3s%s\t%s\n",$_/1024**$x,qw<K M G>[$x],$F[1]);'
Run Code Online (Sandbox Code Playgroud)

Mis*_*rEd 5

这用于Number::Bytes::HumanCPAN:

du -ks * |perl -MNumber::Bytes::Human=format_bytes -nle \
    '@F=split(/\s+/,$_,2); printf("%-10s%s\n", format_bytes($F[0]*1024), $F[1])'
Run Code Online (Sandbox Code Playgroud)

编辑:不使用模块:

du -ks * |perl -nle \
   '@F=split(/\s+/,$_,2); $b=$F[0]*1024; for($i=0;$b>1024;$i++){$b/=1024} $u=qw{B K M G T}[$i]; printf("%10.".($b=~/\./?1:0)."f$u  %s\n", $b, $F[1])'
Run Code Online (Sandbox Code Playgroud)

  • @ user606723:对,它不是核心Perl安装的一部分.您需要从CPAN下载它. (2认同)
  • @ user606723 - 好吧,如果您安装模块,那么您可以根据需要多次使用该衬垫.这是模块背后的主要思想之一:高度可重用的代码. (2认同)