张芷铭的个人博客

作为运维、开发,甚至是普通桌面用户,你一定遇到过这些痛点:服务器根分区突然爆满,du -sh * 半天刷不出结果;经典的 ncdu 在百万级文件的SSD上慢得令人抓狂;想快速定位大文件却要在冗长的输出里翻找。

今天要介绍的 gdu(Go Disk Usage),就是为解决这些问题而生的终端磁盘分析神器——用 Go 原生编写,专为现代 SSD 优化,凭借多核并行扫描能力,速度远超传统工具,同时保留了直观的 TUI 交互,是 Linux/macOS/Windows 全平台通用的磁盘管理终极方案。

一、什么是 gdu?

gdu 是一款开源的终端磁盘占用分析工具,由 GitHub 开发者 @Dundee 维护,核心仓库地址:https://github.com/Dundee/gdu。

它的核心设计理念是平衡极致性能与易用性,相比传统工具拥有不可替代的优势:

  • 极速并行扫描:充分利用多核 CPU 并行处理,SSD 环境下扫描速度是 ncdu 的 3-5 倍,百万级文件目录也能秒级出结果;
  • 智能内存管理:自动根据主机空闲内存调整 GC 策略,空闲内存充足时直接关闭 GC 榨满性能,内存受限环境也能稳定运行;
  • 直观 TUI 交互:类 ncdu 的终端交互界面,全键盘操作,支持目录导航、一键删除、排序筛选,新手也能快速上手;
  • 全平台兼容:原生支持 Linux、macOS、Windows,无需额外依赖,单二进制文件开箱即用;
  • 丰富的自动化能力:支持非交互模式、JSON 报告导出/导入、定时监控,完美适配脚本与自动化运维场景。

核心性能对比

在包含 10 万个文件的生产环境目录测试中,主流磁盘分析工具的性能表现如下:

工具扫描耗时内存占用核心优势
gdu0.8s85MB速度最快,综合表现最优
ncdu3.2s62MB经典稳定,内存占用低
dust1.5s110MB可视化树状展示
du -sh2.1s12MB系统原生,功能单一

二、全平台一键安装

gdu 提供了丰富的安装方式,单二进制文件无依赖,所有平台均可快速部署。

Linux 系统

Debian/Ubuntu 系列

1
sudo apt update && sudo apt install gdu

RHEL/CentOS/Fedora 系列

1
2
3
4
5
6
# Fedora
sudo dnf install gdu

# CentOS/RHEL
sudo yum install epel-release
sudo yum install gdu

Arch Linux

1
sudo pacman -S gdu

通用二进制安装(无 root 权限也可用)

1
2
3
4
5
6
# 下载最新版本(x86_64,其他架构可去官方仓库替换链接)
curl -L https://github.com/Dundee/gdu/releases/latest/download/gdu_linux_amd64.tgz | tar xz
# 赋予执行权限
chmod +x gdu_linux_amd64
# 移动到系统 PATH
sudo mv gdu_linux_amd64 /usr/local/bin/gdu

macOS

1
2
# Homebrew 一键安装
brew install gdu

Windows

1
2
3
4
5
# Winget 安装
winget install gdu

# Chocolatey 安装
choco install gdu

安装完成后,执行 gdu -v 即可查看版本,验证安装成功。

三、基础使用:交互式 TUI 核心操作

交互式模式是 gdu 最常用的场景,也是手动排查磁盘问题的核心玩法,零学习成本,上手即用。

基础启动命令

1
2
3
4
5
6
7
8
9
# 1. 扫描当前工作目录
gdu

# 2. 扫描指定目录(最常用)
gdu /home
gdu /var/log

# 3. 一键查看所有挂载磁盘的使用情况(替代 df -h)
gdu -d

启动后,你会进入 gdu 的 TUI 界面,默认按文件大小降序排列,目录/文件大小、占用占比、名称一目了然。

核心快捷键大全

? 可随时调出完整帮助面板,核心操作整理如下,记住这几个就能玩转 90% 的场景:

分类快捷键功能说明
导航操作↑/k、↓/j上下移动光标选中项目
→/Enter/l进入选中的子目录
←/h返回上一级父目录
g、G快速跳转到列表顶部/底部
文件操作d删除选中的文件/目录(二次确认,谨慎使用)
e清空目录内容(保留目录本身)
v打开选中文件的预览(仅文本文件)
排序与显示s按文件大小降序排序(默认)
n按文件/目录名称升序排序
C显示目录内的文件/子目录数量
M显示目录内文件的最新修改时间
B显示目录的相对大小占比
其他操作?打开帮助面板
q/Ctrl+C退出 gdu

新手入门实战:快速定位并清理大文件

  1. 执行 gdu /home/yourname 扫描个人目录,启动后最大的文件/目录会排在最顶部;
  2. 选中占用异常的大目录(比如 Downloads),按 Enter 进入查看内部详情;
  3. 确认无用的大文件后,按 d 键,在弹出的确认框中按 Enter 即可删除;
  4. 返回上一级,继续排查其他目录,完成后按 q 退出。

四、常用参数全解析

gdu 提供了丰富的命令行参数,可精准控制扫描行为、过滤规则、输出格式,按功能分类整理如下,所有参数均可通过 gdu --help 查看完整说明。

1. 扫描控制类

参数全称功能说明实用示例
-d--show-disks显示所有挂载磁盘的分区使用情况gdu -d 替代 df -h,直观查看所有磁盘占用
-x--no-cross不跨越文件系统边界(不扫描其他挂载点)gdu -x / 仅扫描系统盘,忽略数据盘、挂载的容器目录
--follow-symlinks-跟随符号链接,统计链接指向的实际文件大小gdu --follow-symlinks ~/projects 分析包含软链接的项目目录
--depth-限制非交互模式下的目录扫描深度(v2.9.0+ 新增)gdu -n --depth=2 /var 仅显示2层目录结构,避免输出冗长

2. 过滤排除类

参数全称功能说明实用示例
-H--no-hidden忽略隐藏文件/目录(以 . 开头的文件)gdu -H ~ 扫描家目录时跳过隐藏文件,提升扫描速度
-i--ignore-dirs排除指定目录,多个目录用逗号分隔gdu / -i /proc,/sys,/dev 扫描系统盘时跳过系统虚拟目录
-I--ignore-pattern按正则表达式排除匹配的文件/目录gdu ~ -I "*.log|node_modules" 跳过日志文件和前端依赖目录

3. 输出与格式类

参数全称功能说明实用示例
-a--show-apparent-size显示文件表观大小(而非实际磁盘占用块大小)gdu -a /var/lib/docker 精准查看容器镜像的表观大小
--si-使用十进制 SI 单位(KB/MB/GB)替代默认的二进制单位(KiB/MiB/GiB)gdu --si /home 符合日常使用习惯的单位显示
-c--no-color禁用彩色输出gdu -c /tmp 适配不支持彩色的终端环境
--export-json-将扫描结果导出为 JSON 文件gdu /home --export-json disk_report.json 存档分析结果
--import-json-导入之前导出的 JSON 报告gdu --import-json disk_report.json 离线查看历史扫描结果

4. 非交互模式专用

参数全称功能说明实用示例
-n--non-interactive启用非交互模式,直接输出结果到终端(适配脚本)gdu -n /var/log 非交互模式打印目录占用
-s--summarize非交互模式下仅显示总计大小gdu -n -s /home 快速获取目录总占用
-t--top非交互模式下仅显示前 X 个最大的文件gdu -n -t 10 / 找出系统盘最大的10个文件

5. 性能与高级配置

参数全称功能说明实用示例
-g--const-gc启用恒定 GC 策略,降低 30% 内存占用,扫描速度降低约 25%GOGC=200 gdu -g /bigdata 内存受限环境下扫描大目录
--write-config-将当前配置写入默认配置文件 ~/.gdu.yamlgdu --si --no-hidden --write-config 永久保存常用配置

五、高阶实战场景

掌握了基础用法,我们来看看 gdu 在生产环境、日常运维中的 5 个高频实战场景,直接落地解决实际问题。

场景1:服务器磁盘爆满应急排查

这是运维最常见的应急场景,核心需求是最快速度定位占用最高的目录,同时避免扫描无关挂载点

最佳实践命令

1
2
3
4
5
6
7
8
# 1. 先查看全局磁盘情况,确认爆满分区
gdu -d

# 2. 精准扫描系统盘,跳过虚拟目录、其他挂载点,秒级出结果
sudo gdu -x / -i /proc,/sys,/dev,/run

# 3. 快速定位/var目录下最大的10个文件
sudo gdu -n -t 10 /var

操作流程

  1. gdu -d 确认哪个分区爆满,避免盲目扫描;
  2. -x 参数锁定目标分区,不跨文件系统,避免扫描数据盘、网络挂载盘;
  3. -i 排除无意义的系统虚拟目录,进一步提升扫描速度;
  4. 进入高占用目录后,用 d 键清理无用日志、缓存文件,快速释放空间。

场景2:自动化磁盘监控与历史对比

gdu 的非交互模式+JSON导出能力,可完美融入自动化运维体系,实现磁盘占用的定时监控、历史趋势对比。

步骤1:编写监控脚本 disk_monitor.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
# 定义监控目录和报告存储路径
MONITOR_DIR="/data"
REPORT_DIR="/var/log/gdu_reports"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建报告目录
mkdir -p $REPORT_DIR

# 导出扫描结果到JSON,按日期命名
gdu $MONITOR_DIR --export-json $REPORT_DIR/disk_$DATE.json

# 非交互模式输出TOP20大文件,保存到日志
gdu -n -t 20 $MONITOR_DIR > $REPORT_DIR/top20_$DATE.log

步骤2:设置定时任务

1
2
3
4
5
6
7
# 给脚本赋予执行权限
chmod +x disk_monitor.sh

# 编辑crontab,每天凌晨2点执行一次
crontab -e
# 添加以下内容
0 2 * * * /root/disk_monitor.sh

步骤3:历史报告对比

1
2
# 导入昨天的报告,对比目录增长情况
gdu --import-json $REPORT_DIR/disk_20260301_020000.json

场景3:系统盘精准瘦身(安全无风险)

很多新手清理系统盘时容易误删系统文件,gdu 可以帮你精准定位可清理的无用文件,全程可控。

安全瘦身命令

1
2
3
4
5
6
7
8
9
# 扫描系统盘,仅扫描当前文件系统,跳过系统核心目录
sudo gdu -x / -i /proc,/sys,/dev,/boot,/usr/lib

# 重点清理目录(可直接进入操作)
# 1. /var/cache/apt/archives:apt 缓存的安装包
# 2. /var/log:系统日志文件
# 3. /var/lib/docker/overlay2:无用的容器镜像、卷
# 4. ~/.cache:用户应用缓存
# 5. ~/.local/share/Trash:回收站文件

安全原则

  • 系统核心目录(/boot、/usr/lib、/etc)只看不删,避免系统崩溃;
  • 删除前用 v 键预览文件内容,确认无用再操作;
  • 日志文件建议用 e 清空内容,而非直接删除文件,避免服务无法写入日志。

场景4:项目依赖体积分析

开发过程中,经常会遇到项目依赖体积爆炸的问题,比如前端的 node_modules、Java 的 Maven 仓库、Go 的 vendor 目录,gdu 可以帮你快速定位体积最大的依赖包。

前端项目分析示例

1
2
3
4
5
6
# 进入项目目录,扫描node_modules,跳过隐藏文件
cd my-vue-app
gdu -H node_modules

# 非交互模式直接输出TOP10最大的依赖包
gdu -n -t 10 node_modules

进阶用法

结合 --ignore-pattern 过滤无用文件,分析项目有效代码体积:

1
gdu ./src -I "*.map\|*.min.js\|node_modules"

场景5:远程服务器批量磁盘分析

需要批量管理多台服务器时,可通过 ssh 结合 gdu 批量获取磁盘分析报告,无需逐台登录。

批量扫描脚本示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash
# 服务器列表
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
USER="root"
DATE=$(date +%Y%m%d)

for server in "${SERVERS[@]}"; do
  echo "正在扫描 $server..."
  # 远程执行gdu,导出JSON并拉取到本地
  ssh $USER@$server "gdu / -x --export-json /tmp/disk_$server.json"
  scp $USER@$server:/tmp/disk_$server.json ./reports/$DATE/
  echo "$server 扫描完成"
done

六、进阶技巧与个性化配置

1. 永久配置文件

每次输入大量参数太麻烦,gdu 支持通过 yaml 配置文件永久保存你的常用设置。

1
2
3
# 生成默认配置文件
gdu --write-config
# 配置文件路径:~/.gdu.yaml

示例配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 常用配置
show_apparent_size: false
no_hidden: false
no_color: false
si: true  # 默认使用GB/MB单位
show_item_count: true
show_mtime: true
# 永久排除的目录
ignore_dirs:
  - /proc
  - /sys
  - /dev
  - /run

2. Shell 别名提升效率

~/.bashrc~/.zshrc 中添加常用别名,一键调用:

1
2
3
4
5
6
7
8
# 快速查看所有磁盘
alias gdu-disk='gdu -d'
# 安全扫描系统盘
alias gdu-system='sudo gdu -x / -i /proc,/sys,/dev,/run'
# 快速查看当前目录TOP10大文件
alias gdu-top='gdu -n -t 10 .'
# 家目录扫描,跳过隐藏文件
alias gdu-home='gdu -H ~'

添加后执行 source ~/.bashrc 生效,直接输入别名即可使用。

3. 内存与性能调优

  • 极致性能模式:空闲内存充足时,gdu 会自动关闭 GC 实现最快扫描,无需额外参数;

  • 低内存模式:服务器内存受限,扫描超大目录时,用 -g 参数降低内存占用:

    1
    2
    
    # 内存占用降低30%,适合小内存VPS
    GOGC=50 gdu -g /bigdata
    
  • 跳过隐藏文件:用 -H 参数跳过隐藏目录,可大幅提升扫描速度,减少内存占用。

七、常见问题与避坑指南

1. 扫描时提示「permission denied」

原因:当前用户没有目标目录的读取权限。 解决方案

  • 系统目录、其他用户目录用 sudo 提升权限执行;
  • -i 参数排除无权限的目录,避免报错打断扫描。

2. 删除文件后,磁盘空间没有释放

原因:删除的文件正在被其他进程占用,Linux 中进程持有文件句柄时,文件不会真正被删除,直到进程退出。 解决方案

  • lsof | grep deleted 查看被删除但仍被占用的文件;
  • 重启对应的服务释放文件句柄,或直接重启服务器。

3. 软链接目录的大小统计异常

原因:gdu 默认仅统计软链接文件本身的大小,不会跟随链接统计实际目录内容。 解决方案

  • 扫描时添加 --follow-symlinks 参数,跟随软链接统计实际大小;
  • 注意:该参数会避免循环链接,无需担心死循环问题。

4. 终端彩色输出异常、乱码

原因:终端不支持 256 色或 Unicode 字符。 解决方案

  • 添加 -c 参数禁用彩色输出;
  • 添加 -u 参数禁用 Unicode 符号。

八、总结

gdu 完美解决了传统磁盘分析工具的痛点:SSD 时代的性能瓶颈、复杂参数的学习成本、自动化场景的适配能力

无论是新手用户想快速清理电脑磁盘,还是运维工程师应急排查服务器故障,亦或是开发人员分析项目依赖体积,gdu 都能以极致的速度和极简的操作,帮你搞定磁盘空间管理的所有需求。

它的核心优势可以用一句话概括:比它快的没它易用,比它易用的没它快,全平台通用,开箱即用

最后,附上项目官方仓库,欢迎给作者 Star:https://github.com/Dundee/gdu

Comments