千字节到人类可读。寻找一班轮
我经常在没有 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]);
像这样运行:
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 位小数。带舍入。
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]);'
I often work on unix boxes that don't have the -h flag for du.
I am looking for a one-liner to convert KB to human readable. Perl seemed like a good choice.
This is what I have so far.
@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 like this:
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]);'
It doesn't work perfectly as I haven't been able to find the correct printf format.
one-liners using perl as well as awk/sed, etc. would be the most useful.
This is what du -h looks like. Max 1 decimal. Min: 0 decimals. With Rounding.
8.0K
1.7M
4.0M
5.7M
88K
Update:
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]);'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这使用 CPAN 中的
Number::Bytes::Human
:编辑:不使用模块:
This uses
Number::Bytes::Human
from CPAN:EDIT: Without using modules:
如果您想要较大数字的分数:
If you want fractions on the bigger numbers:
您正确的 printf() 格式:
这不是我的代码,它取自此处
your correct printf() format:
that's not my code, it was taken from here
如果您想要进行的唯一修改(不清楚您想要什么)是让数字在 3 个字符的字段中右对齐,只需从 printf 格式中删除句点即可。另外,我建议不要显式调用
split
并将整个$_
视为数字,而是建议向 Perl 传递-a
开关,该开关自动将空格上的$_
拆分到数组@F
中,然后将代码中对$_
的引用替换为$F [0]
。因此,您的代码可以重写(使用更多 Perlism 并添加一些空格以提高可读性):
If the only modification you want to make (It's not clear what you want) is to have the number be right-aligned in a field of 3 characters, simply drop the period from the printf format. Also, rather than explicitly calling
split
and treating the whole of$_
as a number, I would recommend passing Perl the-a
switch, which automatically splits$_
on whitespace into the array@F
, and then replace the references to$_
in your code with$F[0]
.Your code could thus be rewritten (using a couple more Perlisms and adding some spaces for readability) as:
这是改编自 stackoverflow 上的一些答案的 AWK 函数:
Here is AWK function adapted from some answer on stackoverflow: