最大数量的Bash参数!=最大数量cp参数?

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

出于好奇,我想知道我可以使用的参数的最大数量是多less,而且我发现这个post说这是系统相关的,我可以运行这个命令来找出:

$ getconf ARG_MAX 

令我惊讶的是,我回来的那个小女孩是:

 2621440 

刚超过260万 。 正如我所说,我正在操作的文件数量远远less于这个数字 – 大约是40万。 我肯定需要使用移动和复制这些文件的xargs方法,因为我尝试使用正常的mv * ...cp * ...并且得到了“参数列表太长”的错误。

那么, mvcp命令对于我可以使用的参数数量有自己的固定限制(我在man手册中找不到任何东西),还是我错过了一些东西?

正如Ignacio所说, ARG_MAX是传递给exec()的参数缓冲区的最大长度,而不是文件的最大数目( 这个页面有一个非常深入的解释)。 具体来说,它列出了fs/exec.c作为检查以下条件:

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

而且,看起来,你还有一些额外的限制:

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

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