XX系统,通过FTP给客户实时传送文件,正常逻辑是客户收到文件后,自动删除FTP服务器上的本地文件,但经常出现文件已经推送了,客户没删除文件的情况。每个文件其实是很小的,可能几K,但是量很大,1天几万个,以至于时间久了,本地积的文件就会很多。我们不说让客户怎么排查问题,单就这个现象,如果积了几百万的小文件,我们能做些什么?你可能会说,删了啊,确实应该删了,但是小文件多了,会产生什么影响?如果直接rm,你认为行么?
颜总这篇小文,就是介绍了针对这种情况的操作,《Linux如何快速删除大量碎小文件?》,受益匪浅。
Linux文件系统容量分为大小容量和inode容量,前者限制大小,后者限制数量。
使用df -h,查看大小容量使用情况。使用df -i,查看inode容量使用情。
当我们遇到文件系统容量爆满,首先快速定位,
du -a data |sort -nr|head -n 10
2. 统计指定目录下文件数
ls -Rf1 data |grep '^-' |wc -l
/dev/mapper/red-root 550G 550G 20K 100%
通常,监控工具只关注大小容量空间使用情况,很少关注inode空间。
ls: memory exhausted
很显然,在问题目录ls命令已经无法将所有文件列出来。因为ls默认会对文件按首字母排序,而排序过程需要消耗内存,文件非常多的时候,对内存的消耗是非常恐怖的。
ls -f1 ./* > ~/clear.log
-rw-r--r-- 1 oradba oinstall 5533944289 Jan 10 14:53 clear.log
由于文件过大,无法查看并使用,如下使用split命令将该文件切分成每一个500Mb。
split -b 500M clear.log -d -a 3 clear.log
分割后:

编写脚本,按照文件批量删除,
[root@localhost ~]$ cat clear.sh#!/bin/bashfor i in `cat clear000`dorm -rf ./$idoneecho "complete!"
另一种方案,
ls -f1 ./* | head -n 1000 | xargs rm -f
说到这里,可能有同学会说,为什么不在问题目录下rm -rf ./* 呢?
这里提一下./*的工作原理,他将目录下所有文件名串接到rm -rf后边。像这样:
rm -rf a b c d e f ...
如上,这是一条shell指令。不幸的是无论unix,还是linux,都对单条命令长度有最大限制。
AIX操作系统受参数ARG_MAX的限制,getconf arg_max查询。Linux操作系统受参数LINE_MAX的限制,getconf line_max查询。
近期的热文:
《Gdevops峰会:一起探讨国产分布式数据库的选型与应用》




