最近在SUSE LINUX操作系统中遇到个问题:在一个包含上万个文件的文件夹中执行rm *删除所有文件时报错“Arg list too long”,最后导致删除失败。后来查了下资料,经过分析发现这里有以下几个技术点需要注意:
1. 在LINUX操作系统有限制单条命令行的长度是128KB,也就是131072字节,同时rm *这个命令在删除所有文件时,这个*作为通配符最终会转换成改文件的全路径,使得系统底层将rm *转换成了一个超过128KB大小的命令行,从而命令执行失败;
2. 查询LINUX操作系统中单条命令行的长度限制:可在LINUX操作系统中执行getconf ARG_MAX,回显信息即为该限制的字节数;
3. ARG_MAX参数在Solaris中是1048320字节(1024KB),在LINUX中式131072字节(128KB);
4. ARG_MAX参数定义是在LINUX/UNIX操作系统的内核中。
最后,对于前面提到的rm *的问题,其实可以通过以下方法解决,采用管道符和xargs的结合,确保每次rm的时候只删除一个文件,那么就不可能出现单条命令超过128KB字符长度的问题了:
# ls | xargs rm