du -sh /dir/*
进行排序?我读过一个网站说使用| sort -n
,但这显然是不对的。这是一个错误的示例。[~]# du -sh /var/* | sort -n
0 /var/mail
1.2M /var/www
1.8M /var/tmp
1.9G /var/named
2.9M /var/run
4.1G /var/log
8.0K /var/account
8.0K /var/crash
8.0K /var/cvs
8.0K /var/games
8.0K /var/local
8.0K /var/nis
8.0K /var/opt
8.0K /var/preserve
8.0K /var/racoon
12K /var/aquota.user
12K /var/portsentry
16K /var/ftp
16K /var/quota.user
20K /var/yp
24K /var/db
28K /var/empty
32K /var/lock
84K /var/profiles
224M /var/netenberg
235M /var/cpanel
245M /var/cache
620M /var/lib
748K /var/spool
#1 楼
如果您具有GNU coreutils(在大多数Linux发行版中很常见),则可以使用du -sh -- * | sort -h
-h
选项告诉sort
输入是人类可读的格式(数字为单位;基于1024;因此1023被认为小于1K,恰好与GNU du -h
的功能相匹配。)此功能已于2009年8月添加到GNU Core Utilities 7.5。
注意:
如果使用的是较旧的Mac OSX版本,您需要安装带有
brew install coreutils
的coreutils,然后使用gsort
替代sort
。较新版本的macOS(在Mojave上验证)原生支持
sort -h
。评论
注意:如果要在顶部添加大号,请添加-r进行排序
– xenoterracide
2010-12-09 12:52
在OSX上,您可以通过brew安装coreutils,并将bin文件夹添加到PATH中的rc文件中,并且-h应该可用。
– Kenorb
2015年5月5日14:20
哦-谢谢您的-r提醒。这意味着我不需要tail命令来查看猪。
– SDsolar
17年8月17日在8:26
#2 楼
尝试使用-k标志来计数使用人类可读的1K块。这样,您就具有一个通用单位,并且可以轻松地进行数字排序。du -ck | sort -n
您并不需要明确的人为单位,但是如果您这样做,则会有一个一堆方法来做到这一点。许多人似乎使用了上面的1K块技术,然后再次调用du。
https://serverfault.com/questions/62411/how-can-i-sort-du-h -output-by-size
如果要查看已添加的KB单位,请使用:
du -k | sed -e 's_^\([0-9]*\)_ KB_' | sort -n
评论
很高兴不必安装其他东西来获得我需要的结果
– Taranaki
17年3月3日在19:07
#3 楼
如果没有最新版本的GNU coreutils,则可以调用不带du
的-h
以获得可排序的输出,并通过少量的后处理即可生成对人友好的输出。即使您的du
版本没有-h
标志,这也可以正常工作。 du -k | sort -n | awk '
function human(x) {
if (x<1000) {return x} else {x/=1024}
s="kMGTEPZY";
while (x>=1000 && length(s)>1)
{x/=1024; s=substr(s,2)}
return int(x+0.5) substr(s,1,1)
}
{gsub(/^[0-9]+/, human()); print}'
如果要使用SI后缀(即1000的倍数而不是1024的倍数),请在
while
循环主体中将1024更改为1000。 (请注意,该条件是预期的1000,因此将得到1M
而不是1000k
。)如果
du
可以显示以字节为单位的大小(例如-b
或-B 1
),请注意可能会对计算实际文件大小而不是磁盘使用量有副作用),请在s
的开头(即s=" kMGTEPYZ";
)添加一个空格,或者在if (x<1000) {return x} else {x/=1024}
函数的开头添加human
。显示一个留给读者练习的范围是1–10范围内的数字的小数位数。
评论
这是我发现在Linux和Mac上均可使用的即用型解决方案。非常感谢!
–布赖恩·格雷厄姆(Brian Graham)
16年8月1日在21:46
#4 楼
如果没有sort -h
,则可以执行以下操作:du -sh * | sed 's/\([[:digit:]]\)\t/B\t/' | sed 's/\(.\t\)/\t/' | sed 's/G\t/Z\t/' | sort -n -k 2d,2 -k 1n,1 | sed 's/Z\t/G\t/'
这将获取du列表,分隔后缀,然后使用该列表进行排序。由于没有<1K的后缀,因此第一个sed添加一个B(用于字节)。第二个sed在数字和后缀之间添加定界符。第三个sed将G转换为Z,使其大于M;如果您有TB文件,则必须将G转换为Y,将T转换为Z。最后,我们按两列进行排序,然后替换G后缀。
评论
很棒的努力,但这并不能为我工作。
– jvriesem
2015年9月3日,下午2:55
#5 楼
在OS X上,您可以通过Homebrew安装所需的coreutils:brew install coreutils
这样,您将获得
gsort
,其中包括-h
命令行参数。#6 楼
这个小的Perl脚本可以解决问题。将其另存为duh
(或任何您想要的名称),然后用duh /dir/*
调用它#!/usr/bin/perl -w
use strict;
my @line;
sub to_human_readable {
my ($number) = @_;
my @postfix = qw( k M G T P );
my $post;
my $divide = 1;
foreach (@postfix) {
$post = $_;
last if (($number / ($divide * 1024)) < 1);
$divide = $divide * 1024;
}
$number = int($number/$divide + 0.5);
return $number . $post;
}
sub trimlengthright {
my ($txt, $len) = @_;
if ( length($txt) >= $len ) {
$txt = substr($txt,0,$len - 1) . " ";
} else {
$txt = $txt . " " x ($len - length($txt));
}
return $txt;
}
sub trimlengthleft {
my ($txt, $len) = @_;
if ( length($txt) >= $len ) {
$txt = substr($txt,0,$len - 1) . " ";
} else {
$txt = " " x ($len - length($txt)) . $txt;
}
return $txt;
}
open(DF,"du -ks @ARGV | sort -n |");
while (<DF>) {
@line = split;
print &trimlengthleft(&to_human_readable($line[0]),5)," "; # size
print &trimlengthright($line[1],70),"\n"; # directory
}
close DF;
#7 楼
由于Mac OS X没有为-h
提供sort
选项(我可能使用的是Mavericks或Yosemite),因此我尝试并学习了sed
和awk
,这是第一次尝试:du -sk * | sort -g | awk '{ numBytes = * 1024; numUnits = split("B K M G T P", unit); num = numBytes; iUnit = 0; while(num >= 1024 && iUnit + 1 < numUnits) { num = num / 1024; iUnit++; } = sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]); print du -sk * | sort -g | awk '{
numBytes = * 1024;
numUnits = split("B K M G T P", unit);
num = numBytes;
iUnit = 0;
while(num >= 1024 && iUnit + 1 < numUnits) {
num = num / 1024;
iUnit++;
}
= sprintf( ((num == 0) ? "%6d%s " : "%6.1f%s "), num, unit[iUnit + 1]);
print 0B bar
0B foo
4.0K wah
43.0M Documents
1.2G Music
2.5G Desktop
4.7G Movies
5.6G VirtualBox VMs
9.0G Dropbox
11.7G Library
21.2G Pictures
27.0G Downloads
;
}'
; }'
这行很长。展开后,它是:
q4312078q
我在Mac OS X Mavericks,优胜美地,Ubuntu 2014-04上尝试过,其中
awk
是默认的awk
(它是nawk
,因为awk
和nawk
都指向/usr/bin/mawk
)或这是Mac上的输出示例:
q4312078q
而不是
du -sk *
,我在@Stefan的答案中看到还显示了总计,并且使用du -skcx *
无需遍历任何文件系统挂载点#8 楼
这是我在Ubuntu 10.04,CentOS 5.5,FreeBSD和Mac OS X上使用的东西。我从www.geekology.co.za/和earthinfo.org借用了这个想法,并从O'Reilly撰写的“ Linux Server Hacks”。我仍在根据自己的需要进行调整。这项工作仍在进行中(例如,今天上午我正在火车上进行这项工作。):
#! /usr/bin/env bash
ducks () {
du -cks -x | sort -n | while read size fname; do
for unit in k M G T P E Z Y; do
if [ $size -lt 1024 ]; then
echo -e "${size}${unit}\t${fname}"
break
fi
size=$((size/1024))
done
done
}
ducks > .ducks && tail .ducks
这里的输出是:
stefan@darwin:~ $ ducks
32M src
42M .cpan
43M .macports
754M doc
865M Work
1G .Trash
4G Library
17G Downloads
30G Documents
56G total
stefan@darwin:~ $
评论
我想你是说du -cks -x *吗? (带有星号)
–nonopolarity
15年4月22日在9:02
星号在此用法中是多余的。试试看。
– Stefan Lasiewski
15年4月22日在18:39
您的意思是将第一组代码放入称为ducks的文件中,然后将chmod a + x ducks放入文件中,然后使用./ducks运行它吗?然后,我只看到Mac OS X和Ubuntu 2014-10上的总磁盘使用情况。我还尝试将ducks(){...}定义放入.bashrc中,然后使用ducks运行它,在Mac OS X上也是如此,只看到总数
–nonopolarity
2015年4月23日在7:20
#9 楼
用这个脚本发疯-$du -k ./* |
> sort -nr |
> awk '
> {split("KB,MB,GB",size,",");}
> {x = 1;while ( >= 1024) { = / 1024;x = x + 1} = sprintf("%-4.2f%s", , size[x]); print q4312078q;}'
#10 楼
在没有GNUsort -h
的情况下,这应该可以在大多数UNIX环境中使用:join -1 2 -2 2 <(du -sk /dir/* 2>/dev/null | sort -k2,2) <(du -sh /dir/* 2>/dev/null | sort -k2,2) | sort -nk2,2 | awk '{ print "\t" }'
#11 楼
该文件名使用空格或撇号处理文件名,并且在不支持xargs -d
或sort -h
的系统上工作:du -s * | sort -n | cut -f2 | tr '\n' '368K diskmanagementd
392K racoon
468K coreaudiod
472K securityd
660K sshd
3.6M php-fpm
' | xargs -0 -I {} du -sh "{}"
其结果是:
q4312078q
#12 楼
这将按照大小的降序对输出进行排序:du -sh /var/* | sort -k 1rn
这将按照大小的增大顺序对输出进行排序:
du -sh /var/* | sort -k 1n
PS:可用于按任何列进行排序,但列值应采用相同的格式
评论
不能。sort -k1rn等效于sort -rn,只是根据每行的十进制数字的初始序列进行数字排序。它不了解浮点,也不了解k,M,G ...后缀。 10.1k被认为大于1.23G
–StéphaneChazelas
17年1月17日14:52
#13 楼
在Solaris上进行了测试!du -kh | sort -nk1 | grep [0-9]K && du -kh | sort -nk1 | grep [0-9]M && du -kh | sort -nk1 | grep [0-9]G
这将递归输出所有目录大小,底部是最大目录(以GB为单位),顶部是最小目录(以KB为单位)。
#14 楼
最大的位于底部:du -sh * | sort -h
#15 楼
命令:du -ah . | sort -k1 -h | tail -n 50
解释:
以易于阅读的形式递归列出当前目录中所有文件/文件夹的大小
du -ah .
对第一列中存在的人类可读大小进行排序,并保持最大的50
sort -k1 -h | tail -n 50
/>
#16 楼
按MB大小排序du --block-size=MiB --max-depth=1 path | sort -n
评论
用户希望获得数字排序的du -h(人类可读输出)的输出。您没有提供答案。您可能还希望将UNIX-SE帐户与其他SE站点上的其他帐户关联。
–胎蛋白
13年3月11日在11:58
#17 楼
该脚本甚至更容易:for i in G M K; do du -h -d1 / | grep [0-9]$i | sort -n; done
#18 楼
适用于OSXdu -h -k {PATH} | sort -n
评论
-k是否只是取消-h,如果这样,那么如何提供OP所要求的可读输出。
–安东
2015年10月10日在7:58
评论
我知道我以前见过。投票最高的答案不是很好,但其他的则更好。可接受的答案sort -h在2017年8月的Ubuntu 16.04 LTS中为我工作。首先,我找到了由cd / mnt挂载的驱动器(由fstab中的UUID挂载)。然后我做du>〜/ dumnt.out然后排序-h〜/ dumnt.out>〜/ dumntsort.out然后我可以做`tail〜/ dumntsort.out看到最大的太空猪。