我最近一直在复制和移动大量文件(~400,000)。我知道可以在Bash命令行上扩展的参数数量有限制,所以我一直使用xargs来限制生成的数字。
出于好奇,我想知道我可以使用的最大参数数量是多少,我发现this post说它是系统相关的,我可以运行此命令来查明:
$ getconf ARG_MAX
令我惊讶的是,我回来的那个人是:
2621440
超过 260万。正如我所说,我操作的文件数远远少于此 - 大约400k。我肯定需要使用移动和复制这些文件的xargs
方法,因为我尝试使用普通mv * ...
或cp * ...
并且错误地获得了“参数列表”错误。
那么,mv
和cp
命令对我可以使用的参数数量有自己的固定限制(我在他们的手册页中找不到任何内容),或者我错过了什么?
答案 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_MAX
是exec(3)
函数的参数的最大长度。 shell不需要支持从命令行传递这个长度的参数。