知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系!
?
工作中系统管理员会使用du命令或者ncdu等工具来查找/分析文件系统中存在的大文件。
通常系统管理员会使用du命令来查看文件或目录,或者直接用 du 命令对目录大小进行排列
如下所示:查找最大的5个目录
[root@localhost ~]#du -h /* 2>/dev/null | sort -rh | head -5
1.5G? /usr878M? /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/a200M/root/test/b
[root@localhost ~]#
重要的
du命令默认输出只会显示目录。如果要显示文件大小,需要加上-a选项?
?使用du -a选项列出目录下所有文件的大小,此时可以看到test/b/file才是最大的文件,占用 200M?
[root@localhost ~]#du -ah test/* | tail -10
1.0M? ?test/a/file931.0? Mtest/a/file
941.0M? test/a/file
951.0M? test/a/file
961.0M? test/a/file
971.0M? test/a/file
981.0M? test/a/file
99501M 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/file121M? /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