Linux
在 Linux 环境下,du 命令可以对 Linux 系统中的文件和目录空间使用情况进行计算和汇总。
当文件占用磁盘空间 80 % 且在暂时无法扩容空间的情况下,可以找出系统中占比磁盘空间较大的具体目录下的文件进行清理,只需执行如下命令即可查看文件夹占用空间大小。

  1. # du -sh

进入占用空间较大的文件夹执行如下命令可以将当前目录下的文件从大到小排序。

  1. # du -sh * |sort -rh

将输出后占用空间较大的文件根据实际情况判断是否可以正常删除,从而来释放磁盘空间并进行观察磁盘使用率。
当文件占用磁盘空间较多时,du 就会执行很慢,每次会反复执行来找出大文件,效率较低,此时ncdu就可以来解决该问题。

一、ncdu

ncdu 是一个使用 C 语言和 ncurses 接口开发的简易快速的磁盘用量分析器,可以用来查看目录或文件在本地或远程系统上占用磁盘空间的情况。

Ubuntu 21.10 安装 ncdu:

  1. # sudo apt-get install ncdu

ncdu 参数选项:

  • -h:帮助信息
  • -q:静音模式,刷新间为 2 秒
  • -v:打印版本
  • -x:相同的文件系统
  • -e:启用扩展信息
  • -r:只读
  • -o FILE:将扫描目录导出为文件
  • -f FILE:从文件中导入扫描目录
  • -0,-1,-2:扫描时使用的 UI (0=none,2=full ncurses)
  • —si:使用基数 10 (SI) 前缀而不是基数 2
  • —exclude PATTERN:排除匹配 PATTERN 的文件
  • -X, —exclude-from FILE:排除与文件中任何模式匹配的文件
  • -L, —follow-symlinks:按照符号链接(不包括目录)
  • —exclude-caches:排除包含 CACHEDIR.TAG 的目录
  • —exclude-kernfs:排除 Linux 伪文件系统(procfs、sysfs、cgroup…)
  • —confirm-quit:确认退出
  • —color SCHEME:设置配色方案

如果不使用任何参数选项,可直接在需要分析的目录下执行命令ncdu,等待 ncdu 扫描完毕后,此时就会弹出一个交互式的终端界面。
可以清晰的看出每个目录的大小,使用方向键或Enter键可进入或退出所选的具体目录。
当发现某个目录或文件占用空间较大时,可根据上述使用键盘情况找到那个文件,切合实际情况确认如果可以删除的话,无需退出 ncdu,选中要删除的目录或文件后,按d键即可删除,若删除完毕,按q键即可退出。
5 款可替代 du 命令的工具 - 图1

二、dust

dust(du + rust = dust)是用 rust 编写的一个免费、开源、更直观的 du 工具,也是一个提供文件类型和元数据的工具。

Ubuntu 21.10 安装 dust:

du-dust_0.7.1_amd64.deb 是 dust GitHub 存储库中的最新版本,从 dust 的发布页面下载.deb文件,可执行如下命令进行下载和安装。

  1. # wget https://github.com/bootandy/dust/releases/du-dust_0.7.1_amd64.deb
  2. # dpkg -i du-dust_0.7.1_amd64.deb

对于其他系统,可以参考 GitHub 上 dust 的其他操作系统安装方式。

dust 用法:

  1. dust [FLAGS] [OPTIONS] [--] [inputs]...

dust 参数选项:

  • -f:目录“大小”是子文件/目录的数量,而不是磁盘大小
  • -s:使用文件长度而不是块
  • -p:子目录的路径不会缩短
  • -h:帮助信息
  • -i:不显示隐藏文件
  • -x:仅计算与提供的目录位于同一文件系统上的文件和目录
  • -b:不会显示百分比条或百分比
  • -c:不会打印颜色(通常最大的目录是彩色的)
  • -r:打印树倒置(最大的最高)
  • -t:仅显示这些文件类型
  • -V:打印版本信息
  • -d:显示深度
  • -e:仅包含与此正则表达式匹配的文件。对于 png 文件类型:-e “.png$”
  • -X:排除任何具有此名称的文件或目录
  • -v:排除与此正则表达式匹配的文件。忽略 png 文件类型:-v “.png$”
  • -n:要显示的输出行数。这是高度,(但 h 有帮助)[默认值:23]
  • -w:指定输出的宽度覆盖终端宽度的自动检测

    dust 使用:

    查看当前目录及所有子目录下的文件大小,可以执行以下命令:

    1. # dust

    5 款可替代 du 命令的工具 - 图2
    -p参数可以按照从当前目录起始的完整目录进行显示

    1. # dust -p

    5 款可替代 du 命令的工具 - 图3
    如果只查看多个目录的大小,只需要同时列出这些目录,并用空格分隔开即可:

    1. # dust /bin /etc

    5 款可替代 du 命令的工具 - 图4
    显示文件的长度:

    1. # dust -s

    5 款可替代 du 命令的工具 - 图5
    只显示 10 个目录:

    1. # dust -n 10

    5 款可替代 du 命令的工具 - 图6

    三、duu

    duu 是 Directory Usage Utility(目录使用实用程序)的缩写,基于 Python 语言编写的查看指定目录大小的工具,具有跨平台特性,可以在 Windows、Linux 和 MacOS 操作系统上使用,它是以千字节为单位显示目录磁盘使用情况。

    Ubuntu 21.10 安装 duu:

    安装 duu 工具之前需要先确保系统有没有安装 Python 3 环境,没有的话需要安装一下,有的话忽略即可,不过目前在大多数 Linux 发行版中默认软件仓库都是有 Python 3 的。
    v2.22.tar.gz 是 duu GitHub 存储库中最新版本的源码包,从 duu 的发布页面下载.tar.gz文件,可执行如下命令进行下载和安装。

    1. # wget https://github.com/jftuga/duu/archive/refs/tags/v2.22.tar.gz
    2. # tar -zxvf v2.22.tar.gz

    解压完毕后,进入 duu-2.22 文件夹,查看duu.py文件是否存在。

    1. # ls | grep duu
    2. duu-2.22
    3. # cd duu-2.22/
    4. # ls
    5. duu.py LICENSE README.md

    duu 用法:

    1. duu.py [-h] [-b] [-e] [-q] [-s STATUS] [-n] [-N] [-f] [-S] [-H] [-T THREADS] [-x EXCLUDE] [-X REGEXPR] [-o OUTPUT] [dname]

    duu 参数选项:

  • -h:帮助信息

  • -b:不打印摘要或统计数据,专门用于排序时使用
  • -e:总结文件扩展名
  • -q:不显示单个目录
  • -s:将处理状态发送到 STDERR,每个 STATUS 目录数
  • -n:跳过以“.”开头的目录
  • -N:不递归
  • -f:显示每个目录中的文件数
  • -S:显示均值、中值、众数和标准差文件统计信息
  • -H:以更易读的格式显示数字
  • -T:并发线程数,考虑 SAN
  • -x:排除不分大小写字符串的冒号分隔列表
  • -X:排除不分大小写正则表达式的冒号分隔列表
  • -o:输出到 CSV 文件

    duu 使用:

    查看当前目录的大小,只需要执行如下命令:
    1. # python3 duu.py
    5 款可替代 du 命令的工具 - 图7
    如上图,可以看出 duu 会显示当前目录下文件和目录的数量并按照 Bytes、KB、MB 为单位显示这些文件的总大小,以及每个文件的大小。
    查看某个目录的大小,只需要把目录的绝对路径加上即可:
    1. # python3 duu.py /etc/init.d/
    5 款可替代 du 命令的工具 - 图8

    四、diskus

    diskus 也是基于 Rust 编写的一个小型、快速、可替代du -sh命令的开源工具,diskus 会计算当前目录下所有文件的大小,执行命令diskus效果和du -shdu -sh --bytes是一样的。
    根据 diskus GitHub 存储库的开发者表示,在他的 8 核笔记本电脑上,以 hyperfine 命令行基准测试工具将中等大小的文件夹(15GB、100k 目录、400k 文件)进行测试,对于较小的文件夹测试实际上是没有意义的,因为所有程序都会在合理的时间内完成,而不会中断您的工作流程,从而得出的结论是:diskus 比 du 冷磁盘缓存快十倍左右,热磁盘缓存快三倍多。
    以下是冷磁盘缓存和热磁盘缓存基于diskusdu -shsn p -d0 -j8dust -d0命令测试出的结果对比。

    冷磁盘缓存

    | Command | Mean [s] | Min [s] | Max [s] | Relative | | —- | —- | —- | —- | —- | | diskus | 1.746 ± 0.017 | 1.728 | 1.770 | 1.00 | | du -sh | 17.776 ± 0.549 | 17.139 | 18.413 | 10.18 | | sn p -d0 -j8 | 18.094 ± 0.566 | 17.482 | 18.579 | 10.36 | | dust -d0 | 21.357 ± 0.328 | 20.974 | 21.759 | 12.23 |

热磁盘缓存

Command Mean [s] Min [s] Max [s] Relative
diskus 500.3 ± 17.3 472.9 530.6 1.00
du -sh 1098.3 ± 10.0 1087.8 1122.4 2.20
sn p -d0 -j8 1122.2 ± 18.2 1107.3 1170.1 2.24
dust -d0 3532.1 ± 26.4 3490.0 3563.1 7.06

Ubuntu 21.10 安装 diskus:

diskus_0.7.0_amd64.deb 是 diskus GitHub 存储库中的最新版本,从 diskus 的发布页面下载.deb文件,可执行如下命令进行下载和安装。

  1. # wget https://github.com/sharkdp/diskus/releases/download/v0.7.0/diskus_0.7.0_amd64.deb
  2. # dpkg -i diskus_0.7.0_amd64.deb

对于其他系统,可以参考 GitHub 上 diskus 的其他操作系统安装方式进行安装。

diskus 用法:

  1. diskus [OPTIONS] [path]...

diskus 参数选项:

  • -j:设置线程数(默认:3 x num cores),文件大小的输出格式(十进制:MB,二进制:MiB)[默认:十进制] [可能的值:十进制、二进制]
  • -v:不隐藏文件系统错误
  • -b:计算表观大小而不是磁盘使用量
  • -h:帮助信息
  • -v:版本信息

    diskus 使用:

    使用du -sh 路径的命令可以查看某个目录的大小,这里的-s参数表示显示总大小。

    1. # du -sh /etc
    2. 16M /etc

    如果使用diskus可直接显示当前目录的总大小。

    1. # diskus

    如果想查看某个目录的大小,可以在diskus后面加绝对路径。

    1. # diskus /etc
    2. 16.66 MB (16,662,528 bytes)

    五、tin-summer

    tin-summer(sn)是基于 Rust 语言编写的开源工具,也是du命令的替代品,可以用于查找占用磁盘空间的文件,以更好的输出、更清晰的命令和默认值,而且由于多线程,它甚至可以在计算大目录下的大小时会比 du 命令运行得更快,tin-summer 与 du 命令之间的区别是前者读取文件的大小,而后者则读取磁盘使用情况。
    此外,tin-summer 的开发者也针对 du 和 sn 做了鲜明的使用理由对比。

    使用 du 的理由:

  • 可读取磁盘使用情况,而不仅仅是文件大小

  • 可选的取消引用符号链接
  • 可在小目录上稍微快一点
  • 稳定且支持良好

    使用 sn 的理由:

  • 在大目录下更快

  • 使用正则表达式进行排除,使其在与 —exclude 标志一起使用时比 du 快得多。
  • 默认为可读的输出
  • 彩色输出
  • 通过获得更好的帮助
  • 提供排序输出
  • 查找构建工件
  • 读取文件大小,而不是磁盘使用情况
  • 在 Rust 中可扩展

同时,也做了基准测试,从而来对比 sn 和 du 执行不同目录大小的时间结果。

Directory Size Tool Command Time
600MB sn sn p 60.74 ms
600MB sn sn d 99.92 ms
600MB du du -hacd2 88.28 ms
4GB sn sn p 185.2 ms
4GB sn sn d 271.9 ms
4GB du du -hacd2 195.5 ms
700MB sn sn p 91.05 ms
700MB sn sn d 176.3 ms
700MB du du -hacd2 153.8 ms
7MB sn sn p 19.48 ms
7MB sn sn d 12.72 ms
7MB du du -hacd2 10.13 ms

安装 tin-summer:

  1. # curl -LSfs https://japaric.github.io/trust/install.sh | sh -s -- --git vmchale/tin-summer

也可以使用cargo软件包管理器安装tin-summer,前提是需要在系统上安装 Rust。如果 Rust 已安装好的话,可执行如下命令:

  1. # cargo install tin-summer

如果上述两种安装方式都尚未成功安装 tin-summer,还可以通过 tin-summer GitHub 存储库的发布区下载最新版本的二进制文件进行手动安装。

tin-summer 的使用:

查看当前目录文件大小,无需添加任何参数,tin-summer 也是默认以易读的格式向用户进行输出,可执行如下命令:

  1. # sn f

查看某个特定目录的文件大小,可执行如下命令:

  1. # sn f <path-to-the-directory>

在当前目录中搜索包含构建工件的目录,可执行如下命令:

  1. # sn ar

查找占用超过 200MB 磁盘空间的工件或包含工件的目录,可执行如下命令:

  1. # sn ar -t200M

获取 $DIR 中 10 个最大目录的排序列表,可执行如下命令:

  1. # sn sort $DIR -n12

sn 实际在操作大目录的时候速度比较快,在操作小目录的时候,速度会相对比较慢一些。

参考

dust:https://github.com/bootandy/dust/
duu:https://github.com/jftuga/duu
diskus:https://github.com/sharkdp/diskus/
tin-summer:https://github.com/vmchale/tin-summer