du命令用于查看某个目录总体空间占用状态,它通过stat命令去统计每个文件的大小,统计时会递归统计目录中的文件,也就是说,它会遍历整个待统计目录,所以统计速度上可能并不理想
1. 语法格式
du [OPTION]... [FILE]...
[OPTIONS]
-a,--all: 列出目录中所有文件的统计信息,默认只会列出目录中子目录的统计信息,而不列出文件的统计信息
-h,--human-readable: 人性化显示大小
-S,--reparate-dirs: 不包含子目录的大小
-s,--summarize: 对目录做总的统计,不列出目录内文件的大小信息
-c,--total: 对给出的文件或目录做总计,在统计非同一个目录文件大小时非常有用
-d,--max-depth: 指定显示时的目录深度,默认会递归显示所有层次
--max-depth=N: 只列出给定层次的目录统计,如果N=0,则等价于“-s”
-x,--one-file-system: 忽略不同文件系统上的文件,不对它们进行统计
-X,--exclude-from=FILE: 从文件中读取要排除的文件
--exclude=PATTERN: 指定要忽略不统计的文件
2. 示例
2.1 统计/etc目录的大小
[root@centos7min ~]# du -sh /etc
31M /etc
2.2 只显示第一层子目录和文件的大小
[root@centos7min ~]# du -h --max-depth=1 /usr
58M /usr/bin
37M /usr/sbin
453M /usr/lib
104M /usr/lib64
204M /usr/share
0 /usr/etc
0 /usr/games
36K /usr/include
12M /usr/libexec
0 /usr/local
0 /usr/src
865M /usr
2.3 排除不统计的目录
[root@centos7min ~]# du -h --max-depth=1 --exclude=/usr/lib64 /usr
58M /usr/bin
37M /usr/sbin
453M /usr/lib
204M /usr/share
0 /usr/etc
0 /usr/games
36K /usr/include
12M /usr/libexec
0 /usr/local
0 /usr/src
762M /usr
2.4 搜索符合条件的文件,然后统计它们的总大小。结合find使用,效果极佳,请注意-c和-s统计的区别
[root@centos7min ~]# find /boot/ -type f -name "*.img" -print0 | xargs -0 du -ch
28K /boot/grub2/i386-pc/core.img
4.0K /boot/grub2/i386-pc/boot.img
52M /boot/initramfs-0-rescue-6dc3ab32a5ec4245b313cffa25cec9c3.img
19M /boot/initramfs-3.10.0-957.el7.x86_64.img
11M /boot/initramfs-3.10.0-957.el7.x86_64kdump.img
81M total
[root@centos7min ~]# find /boot/ -type f -name "*.img" -print0 | xargs -0 du -sh
28K /boot/grub2/i386-pc/core.img
4.0K /boot/grub2/i386-pc/boot.img
52M /boot/initramfs-0-rescue-6dc3ab32a5ec4245b313cffa25cec9c3.img
19M /boot/initramfs-3.10.0-957.el7.x86_64.img
11M /boot/initramfs-3.10.0-957.el7.x86_64kdump.img
3. 说明
1)du是通过stat系统调用来统计每个文件(包括子目录)的空间占用总和,因为会对每个涉及到的文件都使用stat,所以统计大量文件时速度较慢
2)因为会遍历统计所有文件,所以统计目录下挂载了其他文件系统时,也会对这个文件系统进行统计,可以使用-x选项使其不统计目录中的其他文件系统
3)如果文件别删除,但被其他进程引用了,由于stat找不到这个文件,du命令将无法对其统计,但该文件的空间并未被释放,所以du统计出来的结果并非完全准确
4)可以跨分区统计分散在各地的文件大小总和,因为他们都能被stat找到并统计