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

Lee*_*ton 29 linux bash command-line-arguments

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

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

$ getconf ARG_MAX
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,我回来的是:

2621440
Run Code Online (Sandbox Code Playgroud)

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

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

Wya*_*son 27

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

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *) / sizeof(void *)
Run Code Online (Sandbox Code Playgroud)

并且,似乎您有一些额外的限制:

在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).


Ign*_*ams 8

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