原创: 厦门微思网络 

du_命令可以像find_命令那样列出最大的文件吗_linux命令

工作中系统管理员会使用 du 命令或者 ncdu 等工具来查找/分析文件系统中存在的大文件。

通常系统管理员会使用 du 命令来查看文件或目录,或者直接用 du 命令对目录大小进行排列

如下所示:查找最大的5个目录

[root@localhost ~]# du -h /* 2>/dev/null | sort -rh | head -5
1.5G /usr
878M /usr/lib
677M /usr/lib/firmware
276M /usr/share
255M /var
[root@localhost ~]#


使用这种方法,可以快速定位到 /usr 目录是最占用空间的,然后再使用相同的方法(切换到 /usr 目录)一层一层的往下检查。

这种方法可以定位到哪个目录最占用空间,但是无法定位到哪个文件最占用空间。

想象一下 test 目录下有2个子目录 a 和 b,其中 a 大小 500M,b 大小 200M。

a 目录下有 500个 1MB 的文件,而 b 目录下只有一个 200MB 的文件。

此时使用 du 方法只能知道 a 目录占用空间大,但不意味着最大的文件就在 a 目录下,因为其实最大的文件在 b 目录中

[root@localhost ~]# du -h ~/* | sort -rh
701M /root/test
501M /root/test/a
200M /root/test/b
[root@localhost ~]#




重要的

du 命令默认输出只会显示目录。如果要显示文件大小,需要加上 -a 选项



使用 du -a 选项列出目录下所有文件的大小,此时可以看到 test/b/file 才是最大的文件,占用 200M

[root@localhost ~]# du -ah test/* | tail -10
1.0M test/a/file93
1.0M test/a/file94
1.0M test/a/file95
1.0M test/a/file96
1.0M test/a/file97
1.0M test/a/file98
1.0M test/a/file99
501M test/a
200M test/b/file
200M test/b
[root@localhost ~]#


但是如果文件很多,这样输出的结果还是有点杂乱无章,主要原因是不太容易区分目录和文件。

find 命令可以很好的解决这个问题,如果要找到系统上最大的文件,可以执行:

[root@localhost ~]# find / -type f | xargs du -sh 2>/dev/null | sort -rh | head -3
200M /root/test/b/file
121M /var/lib/rpm/Packages
83M /boot/initramfs-0-rescue-0f1f1093c97f4c6895bec08ebbe382e0.img
[root@localhost ~]#


使用 du 命令列出最大的3个文件

如果非要使用 du 命令来完成这件事,也可以,思路如下:

1. 使用 du -a 列出所有文件的大小

2. 在所有目录后面手动添加 / 目录符用以区分目录

3. 使用 grep -v 命令过滤掉目录条目即可

[root@localhost ~]# du -aSh /* 2>/dev/null | sort -rh | \
> while IFS=$'\t' read -r size line; \
> do printf "%s\t%s" $size "$line"; \
> [[ -d $line ]] && printf "/"; echo; done | \
> grep -v /$ | head -3
200M /root/test/b/file
121M /var/lib/rpm/Packages
83M /boot/initramfs-0-rescue-0f1f1093c97f4c6895bec08ebbe382e0.img



end