你如何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,则需要安装 coreutils
brew install coreutils
,然后gsort
用作sort
.较新版本的 macOS(已在 Mojave 上验证)
sort -h
原生支持。
答案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]*\)_\1 KB_' | sort -n
答案3
如果你没有最新版本的 GNU coreutils,您可以调用du
without-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($1)); print}'
如果您需要 SI 后缀(即 1000 的倍数而不是 1024),请在while
循环体中将 1024 更改为 1000。 (请注意,条件中的 1000 是有意的,因此您得到的是 eg1M
而不是1000k
。)
如果您du
可以选择以字节为单位显示大小(例如-b
或-B 1
- 请注意,这可能会产生计算实际文件大小而不是磁盘使用情况的副作用),请在 的开头添加一个空格s
(即s=" kMGTEPYZ";
),或if (x<1000) {return x} else {x/=1024}
在 的开头添加功能human
。
显示 1-10 范围内的数字的十进制数字作为练习留给读者。