linux 查找大体积文件和文件夹

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

大体积文件查找

find / -type f -size +50M -exec ls -lsh {} \;

find 查找大文件

其中 find / 就是递归查找根目录下的文件,可以自定义目录, +50M 就是查找大于 50M 的文件,单位和数字可自定义,比如 +1G , +100M 之类的。

大体积文件夹查找

有时候排除完大体积文件,磁盘空间占用还是过高,怎么回事?

那是因为很多应用在保存日志时,为了防止日志过大不好查找,都采取了按天甚至按小时分割日志的情况,分割后的日志体积很小,用find查找很不方便,而无数的小体积日志累积起来,占用磁盘的空间也是很可观的。这时候,就要查找这些日志所在的目录,对日志进行清除。

du -scLB M /home/* |sort -n

显示当前文件夹下的目录体积

这是显示当前目录下文件夹的体积并按从小到大排序,其中 /home/ 为自定义目录。层层递归查找,肯定能找到占用空间大的目录。

当然,如果不想手动递归查找,而选定文件夹内的子文件夹不大的话,可以把 -s 去掉,让系统帮你进行递归:

du -cLB M /home/* |sort -n

递归显示选定目录大小

未删除的文件

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

lsof -n|grep delete

查看标记删除的文件

如图, test.txttail 进程占用,只是被标记了 deleted ,并未释放空间,如果想释放 test.txt 占用的空间,必须要 killtail 进程。

当然,可以一步到位:

lsof -n|grep delete|awk '{print $2}'|xargs kill -9

但是为了保险,建议还是先把进程找出来,再一个个 kill 掉。

通过以上三个流程,基本上就可以把引起空间不足的凶手给揪出来干掉了。

That’s all!