我经常使用没有-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]);
像这样跑:
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]);'
由于我无法找到正确的printf格式,因此效果不佳。
使用perl以及awk / sed等的单行将是最有用的。
这就是du -h的样子。最大1位小数。最小值:0位小数。随着Rounding。
8.0K
1.7M
4.0M
5.7M
88K
更新
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]);'
答案 0 :(得分:5)
这使用CPAN中的Number::Bytes::Human
:
du -ks * |perl -MNumber::Bytes::Human=format_bytes -nle \
'@F=split(/\s+/,$_,2); printf("%-10s%s\n", format_bytes($F[0]*1024), $F[1])'
编辑:不使用模块:
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])'
答案 1 :(得分:2)
你正确的printf()格式:
sub get_filesize_str
{
my $file = shift;
my $size = (stat($file))[7] || die "stat($file): $!\n";
if ($size > 1099511627776) { # TiB: 1024 GiB
return sprintf("%.2f TiB", $size / 1099511627776);
} elsif ($size > 1073741824) { # GiB: 1024 MiB
return sprintf("%.2f GiB", $size / 1073741824);
} elsif ($size > 1048576) { # MiB: 1024 KiB
return sprintf("%.2f MiB", $size / 1048576);
} elsif ($size > 1024) { # KiB: 1024 B
return sprintf("%.2f KiB", $size / 1024);
} else { # bytes
return sprintf("%.2f bytes", $size);
}
}
这不是我的代码,而是来自here
答案 2 :(得分:2)
du -sk * | perl -ane '
$i=0;
while ($F[0]>1024) {$F[0]/=1024; $i++};
printf("%d%s\t%s\n", $F[0], qw(K M G)[$i], $F[1])
'
如果你想要更大数字的分数:
du -sk * | perl -ane '
$i=0;
while ($F[0]>1024) {$F[0]/=1024; $i++;};
$f = $i==0 ? "d" : ".2f";
printf("%$f%s\t%s\n", $F[0], qw(K M G)[$i], $F[1])
'
答案 3 :(得分:1)
如果您想要进行的唯一修改(不清楚您想要的是)是将数字在3个字符的字段中右对齐,只需从printf格式中删除句点。另外,我建议不要显式调用split
并将整个$_
视为一个数字,而是建议将-a
开关传递给Perl,这会自动将空格上的$_
拆分为数组@F
,然后用$_
替换代码中对$F[0]
的引用。
因此可以重写您的代码(使用多个Perlisms并添加一些空格以便于阅读):
du -ks * | perl -lane '$x = $F[0] != 0 && int(log($F[0])/log(1024)); printf("%3d%s\t%s\n", $F[0]/1024**$x, qw<K M G>[$x], $F[1]);'
答案 4 :(得分:0)
这是AWK函数改编自stackoverflow的一些答案:
function human_readable(sum) {
hum[1024**3]="GiB";hum[1024**2]="MiB";hum[1024]="KiB";
for (x=1024**3; x>=1024; x/=1024){
if (sum>=x) { v = sprintf( "%.2f %s",sum/x,hum[x]); return v }
}
}