Tom*_*ner 1224 linux bash gnu du
我需要获取人类可读的 du 输出列表。
但是,du
没有“按大小排序”选项,并且管道sort
无法与人类可读标志一起使用。
例如,运行:
du | sort -n -r
Run Code Online (Sandbox Code Playgroud)
按大小(降序)输出排序的磁盘使用情况:
du |sort -n -r
65108 .
61508 ./dir3
2056 ./dir4
1032 ./dir1
508 ./dir2
Run Code Online (Sandbox Code Playgroud)
但是,使用人类可读的标志运行它,排序不正确:
du -h | sort -n -r
508K ./dir2
64M .
61M ./dir3
2.1M ./dir4
1.1M ./dir1
Run Code Online (Sandbox Code Playgroud)
有谁知道du -h
按大小排序的方法?
ptm*_*man 1719
从2009 年 8 月发布的GNU coreutils 7.5开始,sort
允许使用一个-h
参数,该参数允许以下类型的数字后缀du -h
:
du -hs * | sort -h
Run Code Online (Sandbox Code Playgroud)
如果您使用的排序不支持-h
,您可以安装 GNU Coreutils。例如在较旧的 Mac OS X 上:
brew install coreutils
du -hs * | gsort -h
Run Code Online (Sandbox Code Playgroud)
从sort
手册:
-h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G)
cad*_*ian 100
du | sort -nr | cut -f2- | xargs du -hs
Run Code Online (Sandbox Code Playgroud)
Ada*_*ire 68
@Douglas Leeder,还有一个答案:使用另一种工具对 du -h 的人类可读输出进行排序。像 Perl!
du -h | perl -e 'sub h{%h=(K=>10,M=>20,G=>30);($n,$u)=shift=~/([0-9.]+)(\D)/;
return $n*2**$h{$u}}print sort{h($b)<=>h($a)}<>;'
Run Code Online (Sandbox Code Playgroud)
拆分为两条线以适合显示。您可以以这种方式使用它,也可以将其设为单线,无论哪种方式都可以使用。
输出:
4.5M .
3.7M ./colors
372K ./plugin
128K ./autoload
100K ./doc
100K ./syntax
Run Code Online (Sandbox Code Playgroud)
编辑:在PerlMonks打了几轮高尔夫球后,最终结果如下:
perl -e'%h=map{/.\s/;99**(ord$&&7)-$`,$_}`du -h`;die@h{sort%h}'
Run Code Online (Sandbox Code Playgroud)
Dou*_*der 24
据我所知,您有三个选择:
du
在显示之前更改为排序。sort
以支持数字排序的人类大小。您也可以du -k
使用 KiB 中的大小。
对于选项 3,您可以使用以下脚本:
#!/usr/bin/env python
import sys
import re
sizeRe = re.compile(r"^(\d+)(.*)$")
for line in sys.stdin.readlines():
mo = sizeRe.match(line)
if mo:
size = int(mo.group(1))
if size < 1024:
size = str(size)+"K"
elif size < 1024 ** 2:
size = str(size/1024)+"M"
else:
size = str(size/(1024 ** 2))+"G"
print "%s%s"%(size,mo.group(2))
else:
print line
Run Code Online (Sandbox Code Playgroud)
Joa*_*uer 24
我也遇到过这个问题,我目前正在使用一种解决方法:
du -scBM | sort -n
Run Code Online (Sandbox Code Playgroud)
这不会产生缩放值,但总是产生以兆字节为单位的大小。这还不够完美,但对我来说,总比没有好(或以字节为单位显示大小)。
Ada*_*ire 21
在别处找到了这个帖子。因此,此 shell 脚本将执行您想要的操作,而无需du
两次调用所有内容。它用于awk
将原始字节转换为人类可读的格式。当然,格式略有不同(所有内容都打印到一位小数精度)。
#/bin/bash
du -B1 | sort -nr |awk '{sum=$1;
hum[1024**3]="G";hum[1024**2]="M";hum[1024]="K";
for (x=1024**3; x>=1024; x/=1024){
if (sum>=x) { printf "%.1f%s\t\t",sum/x,hum[x];print $2;break
}}}'
Run Code Online (Sandbox Code Playgroud)
在我的.vim
目录中运行它会产生:
4.4M .
3.6M ./colors
372.0K ./plugin
128.0K ./autoload
100.0K ./syntax
100.0K ./doc
Run Code Online (Sandbox Code Playgroud)
(我希望 3.6M 的配色方案不会过多。)
Den*_*son 20
此版本用于awk
为排序键创建额外的列。它只调用du
一次。输出应该与du
.
我已经把它分成多行,但它可以重新组合成一行。
du -h |
awk '{printf "%s %08.2f\t%s\n",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0}' |
sort -r | cut -f2,3
Run Code Online (Sandbox Code Playgroud)
解释:
在没有cut
命令的情况下尝试看看它在做什么。
这是一个在 AWK 脚本中进行排序的版本,不需要cut
:
du -h |
awk '{idx = sprintf("%s %08.2f %s",
index("KMG", substr($1, length($1))),
substr($1, 0, length($1)-1), $0);
lines[idx] = $0}
END {c = asorti(lines, sorted);
for (i = c; i >= 1; i--)
print lines[sorted[i]]}'
Run Code Online (Sandbox Code Playgroud)
slm*_*slm 20
这是一个以更紧凑的汇总形式显示目录的示例。它处理目录/文件名中的空格。
% du -s * | sort -rn | cut -f2- | xargs -d "\n" du -sh
53G projects
21G Desktop
7.2G VirtualBox VMs
3.7G db
3.3G SparkleShare
2.2G Dropbox
272M apps
47M incoming
14M bin
5.7M rpmbuild
68K vimdir.tgz
Run Code Online (Sandbox Code Playgroud)
小智 16
按大小排序文件(以 MB 为单位)
du --block-size=MiB --max-depth=1 path | sort -n
Run Code Online (Sandbox Code Playgroud)
0x8*_*x89 11
得到另一个:
$ du -B1 | sort -nr | perl -MNumber::Bytes::Human=format_bytes -F'\t' -lane 'print format_bytes($F[0])."\t".$F[1]'
Run Code Online (Sandbox Code Playgroud)
我开始喜欢 perl。你可能需要做一个
$ cpan Number::Bytes::Human
Run Code Online (Sandbox Code Playgroud)
第一的。致所有的 perl 黑客:是的,我知道排序部分也可以在 perl 中完成。也可能是 du 部分。
Boz*_*joe 10
这段代码是从http://www.unix.com/shell-programming-scripting/32555-du-h-sort.html 的“Jean-Pierre”中无耻地截取的。有什么办法可以更好地信任他吗?
du -k | sort -nr | awk '
BEGIN {
split("KB,MB,GB,TB", Units, ",");
}
{
u = 1;
while ($1 >= 1024) {
$1 = $1 / 1024;
u += 1
}
$1 = sprintf("%.1f %s", $1, Units[u]);
print $0;
}
'
Run Code Online (Sandbox Code Playgroud)
小智 9
使用“-g”标志
-g, --general-numeric-sort
compare according to general numerical value
Run Code Online (Sandbox Code Playgroud)
在我的 /usr/local 目录上产生如下输出:
$ du |sort -g
0 ./lib/site_ruby/1.8/rubygems/digest
20 ./lib/site_ruby/1.8/rubygems/ext
20 ./share/xml
24 ./lib/perl
24 ./share/sgml
44 ./lib/site_ruby/1.8/rubygems/package
44 ./share/mime
52 ./share/icons/hicolor
56 ./share/icons
112 ./share/perl/5.10.0/YAML
132 ./lib/site_ruby/1.8/rubygems/commands
132 ./share/man/man3
136 ./share/man
156 ./share/perl/5.10.0
160 ./share/perl
488 ./share
560 ./lib/site_ruby/1.8/rubygems
604 ./lib/site_ruby/1.8
608 ./lib/site_ruby
Run Code Online (Sandbox Code Playgroud)
在网上找到了这个......似乎工作正常
du -sh * | tee /tmp/duout.txt | grep G | sort -rn ; cat /tmp/duout.txt | grep M | sort -rn ; cat /tmp/duout.txt | grep K | sort -rn ; rm /tmp/duout.txt
Run Code Online (Sandbox Code Playgroud)
小智 6
另一个:
du -h | perl -e'
@l{ K, M, G } = ( 1 .. 3 );
print sort {
($aa) = $a =~ /(\w)\s+/;
($bb) = $b =~ /(\w)\s+/;
$l{$aa} <=> $l{$bb} || $a <=> $b
} <>'
Run Code Online (Sandbox Code Playgroud)
我昨天从编造这个例子中学到了 awk。这花了一些时间,但很有趣,我学会了如何使用 awk。
它只运行 du 一次,它的输出与 du -h 非常相似
du --max-depth=0 -k * | sort -nr | awk '{ if($1>=1024*1024) {size=$1/1024/1024; unit="G"} else if($1>=1024) {size=$1/1024; unit="M"} else {size=$1; unit="K"}; if(size<10) format="%.1f%s"; else format="%.0f%s"; res=sprintf(format,size,unit); printf "%-8s %s\n",res,$2 }'
Run Code Online (Sandbox Code Playgroud)
它以一位小数点显示 10 以下的数字。
这是我使用的简单方法,资源使用率非常低,可以满足您的需求:
du --max-depth=1 | sort -n | awk 'BEGIN {OFMT = "%.0f"} {print $1/1024,"MB", $2}'
0 MB ./etc
1 MB ./mail
2 MB ./tmp
123 MB ./public_html
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
857206 次 |
最近记录: |