linux 查找大体积文件和文件夹
在使用 linux 的过程中,常会遇到磁盘空间不足的情况。但由于 linux 没有像 windows 那样有各种助手,以及作为服务器的 linux 基本只有文本模式,所以在各种应用各种文件中搜索引起空间不足的凶手,已成必备技能。下面就来说说 linux 查找大体积文件和文件夹的方法。
大体积文件查找
find / -type f -size +50M -exec ls -lsh {} \;

其中 find /
就是递归查找根目录下的文件,可以自定义目录, +50M
就是查找大于 50M 的文件,单位和数字可自定义,比如 +1G
, +100M
之类的。
大体积文件夹查找
有时候排除完大体积文件,磁盘空间占用还是过高,怎么回事?
那是因为很多应用在保存日志时,为了防止日志过大不好查找,都采取了按天甚至按小时分割日志的情况,分割后的日志体积很小,用find查找很不方便,而无数的小体积日志累积起来,占用磁盘的空间也是很可观的。这时候,就要查找这些日志所在的目录,对日志进行清除。
du -scLB M /home/* |sort -n

这是显示当前目录下文件夹的体积并按从小到大排序,其中 /home/
为自定义目录。层层递归查找,肯定能找到占用空间大的目录。
当然,如果不想手动递归查找,而选定文件夹内的子文件夹不大的话,可以把 -s
去掉,让系统帮你进行递归:
du -cLB M /home/* |sort -n

未删除的文件
用 rm -f
或 rm -rf
把大文件和大文件夹移除后,往往会发现空间占用率并没有下降。那是因为如果文件正在被进程使用,手动进行删除的话,只能是给文件添加了个删除的标记,并没有实际删除,若想删除生效,必须杀掉正在使用文件的进程。可以通过以下方法来查找相关进程:
lsof -n|grep delete

如图, test.txt
被 tail
进程占用,只是被标记了 deleted
,并未释放空间,如果想释放 test.txt
占用的空间,必须要 kill
掉 tail
进程。
当然,可以一步到位:
lsof -n|grep delete|awk '{print $2}'|xargs kill -9
但是为了保险,建议还是先把进程找出来,再一个个 kill
掉。
通过以上三个流程,基本上就可以把引起空间不足的凶手给揪出来干掉了。
That's all!