如何按大小对 du 输出进行排序?

如何按大小对 du 输出进行排序?

你如何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,您可以调用duwithout-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 范围内的数字的十进制数字作为练习留给读者。

答案4

在 OS X 上,您可以通过以下方式安装所需的 coreutils自制:

brew install coreutils

有了这个,您将拥有gsort,其中包括-h命令行参数。

相关内容