Bash参数的最大数量!= max num cp arguments?

时间:2010-11-15 13:55:54

标签: linux bash command-line-arguments

我最近一直在复制和移动大量文件(~400,000)。我知道可以在Bash命令行上扩展的参数数量有限制,所以我一直使用xargs来限制生成的数字。

出于好奇,我想知道我可以使用的最大参数数量是多少,我发现this post说它是系统相关的,我可以运行此命令来查明:

$ getconf ARG_MAX

令我惊讶的是,我回来的那个人是:

2621440

超过 260万。正如我所说,我操作的文件数远远少于此 - 大约400k。我肯定需要使用移动和复制这些文件的xargs方法,因为我尝试使用普通mv * ...cp * ...并且错误地获得了“参数列表”错误。

那么,mvcp命令对我可以使用的参数数量有自己的固定限制(我在他们的手册页中找不到任何内容),或者我错过了什么?

2 个答案:

答案 0 :(得分:27)

正如Ignacio所说,ARG_MAX是传递给exec()的参数的缓冲区的最大长度,而不是文件的最大数量(this page具有非常深入的解释)。具体来说,它会将fs/exec.c列为检查以下条件:

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *) / sizeof(void *)

而且,似乎你有一些额外的限制:

  

在32位Linux上,这是 ARGMAX / 4-1(32767)。如果参数的平均长度小于4,这就变得相关。   从Linux 2.6.23开始,此函数测试MAX_ARG_STRINGS中的数字是否超过<linux/binfmts.h>(2 ^ 32-1 = 4294967296-1)。   作为附加限制,一个参数不得长于MAX_ARG_STRLEN(131072)。

答案 1 :(得分:7)

ARG_MAXexec(3)函数的参数的最大长度。 shell不需要支持从命令行传递这个长度的参数。