问题复现
最近发现一个问题, Linux下一个目录下的文件过多文件的话,如果想要删除文件系统就会提示Argument list too long,
比如我的某个文件夹下有900000(只是举个例子,大多数情况下是没有这么多的)个文件是以 test 开头的,想要删除它们怎么办呢?
通常我们首先想到用rf -f test*命令, 但是。。。我们来看下结果吧
rf -f test*
结果报错
Argument list too long
问题分析
这是Linux的shell参数个数限制,该错误表示执行命令的参数太长,超过系统允许的最大值。
这个值通过ARG_MAX变量获取,命令如下:
getconf ARG_MAX
结果:
131072
这个数值不同机器上的设置可能不同, 和系统也有关系。
问题解决
可以使用两种方法解决:
1. 修改ARG_MAX的值,这个值是没办法直接修改的,需要重新编译Linux内核,手动增加内核中分配给命令行参数的页数,
打开kernel source下面的include/linux/binfmts.h文件,找到如下行:
# define MAX_ARG_PAGES 32
将”32“改为更大的值,例如64或128,然后重新编译内核。
此种方法永久有效,可以彻底解决问题,但是比较复杂,推荐给高级用户使用,没有Linux经验的用户不建议用这种方法。
2. 使用xargs 命令
xargs命令通俗来讲就是将标准输入转成各种格式化的参数,所以命令[command 1] | xargs [command 2]就是将command 1的标准输出结果,通过管道|变成xargs的标准输入,然后xargs再将此标准输入变成参数,传给[command 2]。这样一来,通过xargs命令,我们便可以在管道后面使用那些不接收标准输入的命令了。
执行:
ls | grep test* |xargs rm -f #就能全部删除了
为什么 xargs 就能执行成功, 是因为 xargs 会把参数分批传递给 rm , 这样的话就没有了参数超限的问题了。
抽空我会再写一篇关于 xargs 的文章, 咱们来共同学习下 xargs 这个神奇的命令。