我最近一直在复制和移动大量的文件(〜400,000)。 我知道在Bash命令行上可以扩展的参数数量有限制,所以我一直使用xargs来限制生成的数字。
出于好奇,我想知道我可以使用的参数的最大数量是多less,而且我发现这个post说这是系统相关的,我可以运行这个命令来找出:
$ getconf ARG_MAX
令我惊讶的是,我回来的那个小女孩是:
2621440
刚超过260万 。 正如我所说,我正在操作的文件数量远远less于这个数字 – 大约是40万。 我肯定需要使用移动和复制这些文件的xargs
方法,因为我尝试使用正常的mv * ...
或cp * ...
并且得到了“参数列表太长”的错误。
那么, mv
和cp
命令对于我可以使用的参数数量有自己的固定限制(我在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_MAX
是exec(3)
函数参数的最大长度。 一个shell不需要支持从它的命令行传递这个长度的参数。