news 2026/5/10 11:36:58

Linux du 命令深度解析:从磁盘占用统计到目录空间分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux du 命令深度解析:从磁盘占用统计到目录空间分析

du 的核心原理:递归遍历 + block 计数

du的本质是统计文件占用的磁盘块数量,而不是文件大小。这两者有微妙但重要的区别。

底层实现通过stat()系统调用获取每个文件的st_blocks字段:

// 简化版 du 实现核心逻辑#include<sys/stat.h>#include<dirent.h>off_tcalculate_usage(constchar*path){structstatst;if(lstat(path,&st)<0)return0;// 目录递归遍历if(S_ISDIR(st.st_mode)){DIR*dir=opendir(path);structdirent*entry;off_ttotal=0;while((entry=readdir(dir))!=NULL){if(strcmp(entry->d_name,".")==0||strcmp(entry->d_name,"..")==0)continue;charfullpath[PATH_MAX];snprintf(fullpath,sizeof(fullpath),"%s/%s",path,entry->d_name);total+=calculate_usage(fullpath);}closedir(dir);returntotal+512;// 目录本身占用 1 个 block}// 文件:返回块数 * 512 字节returnst.st_blocks*512;}

关键细节:

  1. st_blocks 是块数,不是字节数:实际占用 =st_blocks * 512
  2. 稀疏文件处理:一个 10GB 的稀疏文件可能只占用几个块
  3. 目录本身占用:每个目录至少占用 4KB(一个 block)

常用参数详解

1.-h人类可读格式 (Human-Readable Format)

du-h/var/log# 4.0K /var/log/apt# 12M /var/log/journal# 128M /var/log

实现原理:遍历单位数组,找到最合适的单位:

functionhumanReadable(bytes:number):string{constunits=['B','K','M','G','T','P']leti=0while(bytes>=1024&&i<units.length-1){bytes/=1024i++}return`${bytes.toFixed(1)}${units[i]}`}

2.-s只显示总计

du-sh/home/user# 2.5G /home/user

跳过递归输出,只返回顶层统计。

3.--max-depth控制层级

du-h--max-depth=1/var# 4.0K /var/tmp# 12M /var/log# 128M /var/lib# 145M /var

这对于快速定位大目录非常有用。

4.-a显示所有文件

默认du只统计目录,-a让它也输出每个文件:

du-ah/tmp# 4.0K /tmp/test.txt# 8.0K /tmp/data.json# 12K /tmp

5.--exclude排除特定文件

du-h--exclude="*.log"/vardu-h--exclude="node_modules"/home/user/project

支持通配符,可以多次使用排除多种模式。

实战场景与性能优化

场景 1:定位大目录

du-h--max-depth=1/var|sort-hr# 145M /var# 128M /var/lib# 12M /var/log# 4.0K /var/tmp

sort -hr按人类可读格式逆序排序,一眼看出最大的目录。

场景 2:排除特定目录

du-sh--exclude="node_modules"--exclude=".git"~/projects/*

统计项目目录时排除依赖和版本控制目录,避免干扰。

场景 3:查找大文件

结合find使用:

find/var-typef-size+100M-execdu-h{}\;

或者直接用du:

du-ah/var|grep-E"^[0-9.]+G"

场景 4:监控目录增长

watch-n60"du -sh /var/log"

每分钟检查/var/log的空间占用,适合监控日志增长。

性能考量

1. 大目录遍历优化

du遍历整个目录树,对于百万文件的目录会很慢。几个优化思路:

  • –one-file-system:不跨文件系统,避免遍历挂载点
  • –threshold:只显示超过指定大小的目录,减少输出
  • 并行处理:GNU parallel 并行统计子目录
# 并行统计子目录find/var-maxdepth1-typed|paralleldu-sh

2. 硬链接处理

du默认会多次计数硬链接。使用-l参数只计数一次:

du-lh/path/to/directory

3. 缓存问题

频繁运行du会影响文件系统缓存。可以用nocache命令避免:

nocachedu-sh/large/directory

与 df 的区别

很多人混淆dudf:

  • df:文件系统级别的空间统计,读取 superblock
  • du:目录/文件级别的空间统计,遍历目录树

典型差异场景:

df-h/var# Filesystem Size Used Avail Use% Mounted on# /dev/sda1 50G 45G 5.0G 90% /du-sh/var# 35G /var

为什么df显示 45G,du只有 35G?

  1. 已删除但仍被占用的文件:进程打开的文件被删除后,空间不会立即释放
  2. 预留空间:ext4 默认预留 5% 给 root
  3. 元数据开销:inode 表、journal 等

查找已删除但仍被占用的文件:

lsof+L1|grepdeleted

Web 实现:浏览器端目录统计

通过 File System Access API,可以在浏览器中实现类似功能:

asyncfunctioncalculateDirectorySize(dirHandle:FileSystemDirectoryHandle):Promise<number>{lettotalSize=0forawait(constentryofdirHandle.values()){if(entry.kind==='file'){constfile=awaitentry.getFile()totalSize+=file.size}elseif(entry.kind==='directory'){constsubDirHandle=awaitdirHandle.getDirectoryHandle(entry.name)totalSize+=awaitcalculateDirectorySize(subDirHandle)}}returntotalSize}// 使用示例constdirHandle=awaitwindow.showDirectoryPicker()constsize=awaitcalculateDirectorySize(dirHandle)console.log(`Total size:${formatBytes(size)}`)

注意:浏览器 API 统计的是文件大小,不是磁盘块数,与原生du有差异。

常见陷阱

1. 权限不足

du会跳过无权限的目录,统计结果可能不完整:

du: cannotreaddirectory'/root':Permission denied

使用sudo获取完整统计。

2. 符号链接

默认du不跟随符号链接。使用-L参数跟随:

du-Lh/path/to/symlink

3. 稀疏文件误判

# 创建稀疏文件ddif=/dev/zeroof=sparse.imgbs=1count=0seek=10Gls-lhsparse.img# -rw-r--r-- 1 user user 10G May 9 22:00 sparse.imgdu-hsparse.img# 0 sparse.img # 实际占用为 0

ls显示文件大小,du显示磁盘占用。

总结

du命令虽然简单,但背后的设计蕴含了 Unix 哲学:专注做一件事,并把它做好。从 block 计数到递归遍历,从硬链接处理到稀疏文件支持,每个细节都经过精心设计。

下次遇到磁盘空间问题,不妨试试这些组合:

# 快速定位大目录du-h--max-depth=1|sort-hr|head-10# 排除干扰项du-sh--exclude="node_modules"--exclude=".git"*# 监控目录增长watch-n60"du -sh /var/log"

希望这篇对你理解du命令有帮助。更详细的命令参数可以查看: Linux du 命令参考


相关工具:Linux df 磁盘空间监控 | 文件大小转换器

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 11:36:00

2026年AI技术大会餐饮安排:3大颠覆性变革、5类参会者精准营养画像、72小时动态餐食推演系统全解析

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;2026年AI技术大会餐饮安排 智能餐券系统接入指南 所有参会者将通过大会官方App领取动态二维码电子餐券&#xff0c;该系统基于OAuth 2.0与大会统一身份认证平台深度集成。首次使用需执行以下初始化命令…

作者头像 李华
网站建设 2026/5/10 11:33:48

构建可穿戴设备ECG AI分析平台:从异构数据到实时推理的工程实践

1. 项目概述&#xff1a;一个为可穿戴设备心电图打造的AI分析中枢在心血管健康监测这个领域&#xff0c;我们正处在一个激动人心的转折点。过去&#xff0c;一份标准12导联心电图&#xff08;ECG&#xff09;的获取和解读&#xff0c;几乎完全依赖于医院或诊所的专业设备与心内…

作者头像 李华
网站建设 2026/5/10 11:31:31

QMC音频解密终极指南:3分钟解锁加密音乐文件

QMC音频解密终极指南&#xff1a;3分钟解锁加密音乐文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐下载的.qmc3、.qmcflac格式无法播放而烦恼吗&#xff…

作者头像 李华
网站建设 2026/5/10 11:26:56

使用 Taotoken 聚合端点后 API 调用延迟与稳定性的实际体验分享

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用 Taotoken 聚合端点后 API 调用延迟与稳定性的实际体验分享 作为一名日常需要调用多种大模型 API 的开发者&#xff0c;模型服…

作者头像 李华