argument list too long报错处理方法

在Linux系统中输入命令,当命令后输入的字符数量超过阈值时,会导致程序运行失败,出现提示:argument list too long。常见于rm、ls、cp、mv和tar等命令对大量文件进行处理时。

1. 查看命令后字符长度阈值

ARG_MAX(maximum length of arguments for a new process)参数用来设置进程的参数字符长度。

# getconf ARG_MAX                
2621440
# ulimit -s
10240

前者是命令后输入的字符数2.6M。后者设置堆栈空间大小,单位是KiB,该值 * 1024 / 4 = 前者。

2. 提高ARG_MAX 阈值

通过ulimit命令提高 ARG_MAX 阈值。

# ulimit -s 102400
# getconf ARG_MAX       
26214400

修改配置文件/etc/security/limits.conf,设置limits参数:

# cat <<EOF >> /etc/security/limits.conf
*	soft	nproc	10240
*	hard	nproc	102400
*	soft	nofile	10240
*	hard	nofile	102400
*	soft	stack	10240
*	hard	stack	102400
EOF

3. 使用循环执行文件操作

使用perl循环删除文件

# perl -e 'while (<*key_word*>) { print "rm -rf $_\n"; }' | sh

得到文件列表后,tar命令使用参数-T输入列表文件进行打包

# perl -e 'while (<*key_word*>) { print "$_\n"; }' > file.list
# tar zcf file.tar.gz -T file.list