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

Posted

技术标签:

【中文标题】Bash 参数的最大数量!= max num cp 参数?【英文标题】:Maximum number of Bash arguments != max num cp arguments? 【发布时间】:2011-05-10 06:13:15 【问题描述】:

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

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

$ getconf ARG_MAX

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

2621440

刚刚超过 260 万。正如我所说,我正在处理的文件数量比这要少得多——大约 400k。我肯定需要使用xargs 方法来移动和复制这些文件,因为我尝试使用普通的mv * ...cp * ... 并得到一个“参数列表太长”的错误。

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

【问题讨论】:

为什么要指定每个文件?你不能只指定他们所在的目录或类似的东西吗? @Christoffer 我不只是将目录从一个地方复制到另一个地方,我还在复制特定文件、重命名文件束、将某些文件从一个地方移动到另一个地方。我在实际执行这些操作时没有问题。我只是好奇cpmv 命令的具体限制是什么。 【参考方案1】:

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

【讨论】:

但是 bash 不强制执行 any 限制,this 说;如果参数列表太长,它只会尝试exec 并传递操作系统错误。【参考方案2】:

正如 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 开始,此函数测试 <linux/binfmts.h> 中的数量是否超过 MAX_ARG_STRINGS (2^32-1 = 4294967296-1)。 作为附加限制,一个参数不得长于MAX_ARG_STRLEN (131072)。

【讨论】:

以上是关于Bash 参数的最大数量!= max num cp 参数?的主要内容,如果未能解决你的问题,请参考以下文章

通过bash从文件中找到最大的数字[重复]

1.10 最大值减去最小值小于或等于num的子数组数量

最大值减去最小值小于或等于 num 的子数组数量问题

最大值减去最小值小于或等于num的子数组数量

队列最大值减去最小值小于等于num的子数组数量

左神算法书籍《程序员代码面试指南》——1_10最大值减去最小值小于或等于num的子数组数量