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

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

出于好奇,我想知道我可以使用的最大参数数量是多少,我发现这篇帖子说它依赖于系统,我可以运行这个命令来找出:

$getconf ARG\u MAX

令我惊讶的是,我得到的答案是:

2621440

刚刚超过260万。正如我所说的,我正在处理的文件数量远远少于这个数量——大约400k。我确实需要使用xargs方法来移动和复制这些文件,因为我尝试使用正常的mv*..cp*..时出现了“参数列表过长”错误

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

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

页面大小*MAX\u ARG\u页面大小-sizeof(void*)/sizeof(void*)

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

在32位Linux上,这是ARGMAX/4-1(32767)。如果参数的平均长度小于4,则这将变得相关。
自Linux 2.6.23以来,此函数测试数字是否超过中的MAX\u ARG\u字符串;linux/binfmts.h&gt(2^32-1=4294967296-1)。
作为附加限制,一个参数的长度不得超过MAX_ARG_STRLEN(131072)

发表评论