使用 du 命令可统计文件和目录磁盘占用,结合 -s、-h、–max-depth、-a 等选项实现简洁或详细输出;通过 du -h /path | sort -rh | head -n 10 快速定位最大占用目录;du 与 df 不同,前者查看文件级占用,后者查看文件系统级空间;结合 find 与 xargs 可精确统计特定类型文件或排除指定目录。
du
命令在 Linux 中是一个极其强大的工具,专门用来统计文件和目录所占用的磁盘空间。它能让你迅速了解某个文件或目录究竟吞噬了多少存储,是排查磁盘空间不足问题的得力助手,也能帮你追踪数据增长的趋势。
解决方案
在使用
du
命令时,你会发现它有很多灵活的选项,能够满足不同的统计需求。最基础的用法是直接跟上目录路径,它会递归地列出该目录下所有子目录和文件的空间占用。
比如,我想看看当前目录的总体大小,我通常会这么做:
du -sh .
这里的
-s
(summary) 选项会只显示总计,而不是列出每个子目录的详细信息,而
-h
(human-readable) 则会将结果以人类更易读的单位(如 K, M, G)显示出来。这比默认的以块(block)为单位显示要直观得多。
如果你想深入了解某个特定目录,比如
/var/log
到底有多少日志文件,占用了多少空间,但又不想看到每个日志文件的详细大小,只想看子目录的总和,可以这样:
du -h --max-depth=1 /var/log
--max-depth=1
限制了
du
只下探一层目录,这在排查哪个子目录是“大户”时非常有用。我个人就很喜欢这个选项,它能让我快速锁定问题区域,而不会被海量的文件列表淹没。
有时候,我需要知道所有文件(包括隐藏文件)和目录的大小,这时候
-a
选项就派上用场了:
du -ah /path/to/directory
这会列出路径下所有文件和目录的大小,同样以人类可读的格式显示。
如何快速找出Linux系统中占用空间最大的目录?
这绝对是运维或开发人员最常遇到的场景之一:服务器磁盘报警,你需要马上找出是哪个目录在“作妖”。我通常会先定位到可能出问题的挂载点,然后用
du
结合
sort
和
head
来快速筛选。
假设我的
/data
分区快满了,我想知道是哪个子目录占用了大部分空间。我会这么做:
sudo du -h /data | sort -rh | head -n 10
这里
sudo
是为了确保我有权限读取所有文件。
du -h /data
会列出
/data
下所有文件和目录的大小(递归)。然后,我用管道
|
把结果传递给
sort -rh
。
-r
表示反向排序(从大到小),
-h
则是让
sort
也能理解人类可读的单位。最后,
head -n 10
截取前10行,也就是占用空间最大的10个目录或文件。
这个组合命令简直是我的救星,它能让我迅速从茫茫多的目录中揪出真正的“胖子”,省去了大量手动检查的时间。我记得有一次,就是靠这个命令,我发现一个日志归档脚本出了问题,导致一个旧目录里堆积了TB级的日志文件,差点把整个文件系统撑爆。
du命令与df命令有何不同,何时选择使用它们?
这是一个经典的混淆点,很多人搞不清
du
和
df
的区别,甚至会觉得它们是重复的。但实际上,它们关注的焦点完全不同。
du
(disk usage) 统计的是文件和目录实际占用的磁盘空间。它会遍历你指定路径下的所有文件和目录,累加它们的大小。这意味着,如果一个文件被多个硬链接引用,
du
可能会多次计算它的空间(尽管有些
du
版本会有优化,但基本原理是这样),或者如果文件是稀疏文件(sparse file),
du
报告的可能是其“逻辑大小”或“实际存储大小”,这取决于具体实现和选项。更重要的是,
du
报告的是文件系统内部的数据块使用情况。
而
df
(disk free) 统计的是文件系统的整体使用情况,它报告的是文件系统层面上的已用空间、可用空间和总空间。
df
不会去遍历文件,它直接查询文件系统的元数据来获取这些信息。这意味着,
df
看到的是文件系统分配给文件的块数,包括了文件系统本身的开销,以及一些可能已经删除但尚未释放的块(比如进程还在持有文件句柄的情况)。
我通常是这样使用的:
-
df -h
df
。比如,我想知道
/
根目录或者
/home
分区是不是快满了,
df
能给我一个宏观的概览。
-
du -sh /path
df
显示某个分区空间不足,需要找出具体是哪个目录或文件导致了空间消耗时,我就会切换到
du
。它能帮我钻进文件系统内部,定位到具体的“罪魁祸首”。
简而言之,
df
看的是“水池的总量和水位”,而
du
看的是“水池里每条鱼和每块石头有多大”。两者结合使用,才能全面地掌握磁盘空间使用状况。
如何精确统计特定文件类型或排除某些文件的目录大小?
有时候,我们不光想知道总大小,还想进行更细致的分析。比如,我只想知道一个项目目录下所有的
.log
文件占了多少空间,或者我想统计大小,但排除掉所有
node_modules
目录。
du
本身就带有一些过滤功能,或者我们可以结合其他命令来实现。
如果你想排除某些目录或文件模式,
du
的
--exclude
选项就非常方便。比如说,在一个开发项目中,
node_modules
目录通常会非常庞大,我可能想在统计项目大小时忽略它:
du -h --exclude="node_modules" --exclude="*.git" /path/to/my/project
这个命令会统计
/path/to/my/project
目录下所有文件和子目录的大小,但会跳过名为
node_modules
的目录以及所有以
.git
结尾的文件或目录。你可以多次使用
--exclude
来排除不同的模式。
如果我的需求更复杂,比如我只想统计所有
.jpg
图像文件的大小,这时候单独使用
du
就不够了。我会结合
find
命令来实现:
find /path/to/images -name "*.jpg" -print0 | xargs -0 du -ch
这个命令链的逻辑是这样的:
-
find /path/to/images -name "*.jpg" -print0
:在指定路径下查找所有以
.jpg
结尾的文件,并用
print0
将文件名以 null 字符分隔输出。这样做是为了正确处理文件名中可能包含空格或特殊字符的情况。
-
xargs -0 du -ch
:
xargs -0
接收
find
输出的 null 分隔的文件名列表,然后对每个文件执行
du -ch
命令。最终,
du -ch
会计算每个
.jpg
文件的大小,并在最后给出一个总和(因为有
-c
选项)。
这种组合命令的灵活性非常高,能让我根据实际需求,精确地筛选出需要统计的目标,这对于进行精细化的存储审计和清理工作非常有帮助。我发现很多时候,只用
du
的基本功能是不够的,灵活运用管道和
find
、
xargs
这些工具,才能真正发挥出 Linux 命令行的强大威力。