命令清单(复制即用)
# 查看当前目录下每个条目的大小(人类可读),并按大小排序
du -sh -- * | sort -h
# 查看某目录一层内各子目录大小(不深入)
du -h --max-depth=1 /path/to/dir | sort -h
# 查看某目录及其子目录的总大小
du -sh /path/to/dir
# 查看单个文件的字节大小与人类可读大小
stat -c 'bytes=%s' file; ls -lh file
# 找出某目录中最大的 20 个文件
find /path/to/dir -type f -printf '%s\t%p\n' | sort -nr | head -20
# 只统计当前挂载的文件系统(不跨挂载点)
du -xh --max-depth=1 /path/to/dir
# 可视化查看目录占用(交互式)
ncdu /path/to/dir
核心概念
- 文件大小有两种衡量:
- 逻辑大小(apparent size):文件内容的字节数(如
stat/ls -l)。
- 磁盘占用(disk usage):实际占用的磁盘块数(如
du)。受稀疏文件、文件系统压缩、块大小等影响。
- “人类可读”显示:
-h 会以 KB/MB/GB 显示,便于阅读。
- 目录大小的本质:目录本身记录条目,
du 通过累加其内文件的占用得出目录的总大小。
查看单个文件大小
1) 使用 ls/stat
# 人类可读大小(KB/MB/GB)
ls -lh file
# 只输出字节数(逻辑大小)
stat -c '%s' file
# 或
wc -c < file # 输出字节数(不显示文件名)
2) du 统计磁盘占用
# 文件实际占用(磁盘块),人类可读
du -h file
# 用字节显示“逻辑大小”(GNU du:--bytes 等效于 --apparent-size --block-size=1)
du -b file
# 显示“逻辑大小”(apparent size),单位人类可读
du -h --apparent-size file
查看目录大小
1) 目录总占用
du -sh /path/to/dir
-s:只输出总计(summary)
-h:人类可读单位
2) 按层级列出
# 仅列出一级子目录占用
du -h --max-depth=1 /path/to/dir | sort -h
# 更深层级(例如两层)
du -h --max-depth=2 /path/to/dir | sort -h
3) 不跨文件系统
# 统计时停留在当前挂载点(不进入其他挂载的分区/设备)
du -xh --max-depth=1 /path/to/dir
4) 列出当前目录每项大小
# 注意通配符不含隐藏文件;如需包含隐藏文件可用 .[!.]* 与 *
du -sh -- * | sort -h
# 包含隐藏文件的简单方法(bash)
du -sh .[^.]* * 2>/dev/null | sort -h
排序与筛选
按大小排序输出
# du 输出后按人类可读单位排序
du -h --max-depth=1 /path/to/dir | sort -h
# 按字节数排序(更精确)
du -B1 --max-depth=1 /path/to/dir | sort -n
找出大文件
# Top 20 最大文件(字节数降序)
find /path/to/dir -type f -printf '%s\t%p\n' | sort -nr | head -20
# 仅匹配特定扩展名(例如日志)
find /var/log -type f -name '*.log' -printf '%s\t%p\n' | sort -nr | head
进阶选项与差异
-
稀疏文件(sparse file):
stat -c %s file 显示逻辑大小(可能很大),但 du 显示占用更小,因为未写入的洞不占块。
- 用
du --apparent-size 看逻辑大小,用不带该选项的 du 看实际占用。
-
文件系统压缩/去重:
- Btrfs/ZFS 等可能因压缩、重复数据消除而使
du 与 stat 差异明显。
-
硬链接(hard link):
- GNU
du 默认“对同一内容只计一次”(即文件有多个硬链接不会重复计入)。
- 若希望对每个硬链接都计一次,使用
du --count-links。
-
块大小与单位:
du -B1 用字节输出,-B1K/-B1M 用固定单位;-h 使用自适应单位。
-
排除路径:
交互式与可视化工具
-
ncdu(推荐):基于 ncurses 的交互式目录体积查看器,支持删除。
# 安装(不同发行版命令略有差异)
sudo apt install ncdu # Debian/Ubuntu
sudo dnf install ncdu # Fedora
sudo yum install ncdu # CentOS/RHEL(可能需 EPEL)
ncdu /path/to/dir
-
tree -h:以树状打印并显示人类可读大小(需安装 tree)。
sudo apt install tree
tree -h /path/to/dir | less
常见坑与建议
-
权限问题:
du 进入目录需要遍历权限;无权限时体积可能不准确,使用 sudo 或针对具体目录统计。
- 示例:
sudo du -sh /var/* | sort -h
-
隐藏文件与挂载点:
- 注意通配符与隐藏文件;统计根目录时可能跨多个挂载点,使用
-x 限制到单一文件系统。
-
远程/网络文件系统:
- NFS/SSHFS 等环境下,
du 性能可能受网络影响;尽量在目标主机本地统计或使用 ncdu 交互筛选。
-
输出管道与本地化:
sort -h 识别人类单位;若不可用,可先转为字节:du -B1 ... | sort -n。
实用示例合集
# 1) 全系统下 /var 目录内各子项占用排行
sudo du -xh --max-depth=1 /var | sort -h
# 2) 项目目录按两层深度统计
du -h --max-depth=2 ~/projects/myapp | sort -h
# 3) 精确找出最大的日志文件
find /var/log -type f -printf '%s\t%p\n' | sort -nr | head -50
# 4) 稀疏文件占用差异演示
truncate -s 10G sparse.img # 逻辑大小 10GB
du -h sparse.img # 实际占用远小于 10GB
du -h --apparent-size sparse.img # 显示逻辑大小
# 5) 仅统计当前挂载点的目录大小
du -xh --max-depth=1 /home | sort -h
# 6) 排除某些目录
du -h --max-depth=1 /path/to/dir --exclude='node_modules' --exclude='.cache' | sort -h
参考与帮助
man du, man stat, man ls, man find, man ncdu, man tree
- GNU coreutils 文档(du/ls/stat 的选项与行为说明)