1. 现象

Linux删除或者ls大量文件时报错:

snippet.bash
[root@test-2 0]# ls tmp/*
-bash: /bin/ls: Argument list too long
 
[root@test-2 0]# rm -f tmp/*
-bash: /bin/ls: Argument list too long

2. 原因

如果待删除文件中包含的小文件数量过多,通常是由于受到shell参数个数限制所致。

这个是Linux系统存在的限制,可以通过如下指令查看该参数值的配置:

snippet.bash
[root@test-2 0]# getconf ARG_MAX
2097152

3. 解决办法

使用 awk 删除

可使用 awk 一次删除一个的方式进行删除。但必须先进入该目录下。

cd tmp
ls -l | awk '{ print "rm -f ",$9}' | sh

结合 xargs 删除

通过 ls 来配合 xargs 删除 test 目录下的所有文件:

snippet.bash
ls /usr/local/tests/ | xargs rm -r

结合 find 删除

通过 find 来完成,更加安全智能,支持的参数更多。

可以先使用 ls 命令列出需要删除的文件看是否正确,然后再执行删除命令。例如,通过如下指令,删除 test 目录下的 png 文件:

snippet.bash
find /usr/local/tests/ -name "*.png" | xargs rm -r