在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