首页 > Linux教程 > 正文

删除大量文件Argument list too long错误解决

问题复现

最近发现一个问题, 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 这个神奇的命令。


上一篇:awk内置变量NR与FNR使用详解
下一篇:Git忽略提交规则.gitignore配置总结

PythonTab微信公众号:

Python技术交流互助群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854