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

标签 linux bash command-line-arguments

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

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

$ getconf ARG_MAX

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

2621440

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

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

最佳答案

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

PAGE_SIZE*MAX_ARG_PAGES-sizeof(void *) / sizeof(void *)

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

On a 32-bit Linux, this is ARGMAX/4-1 (32767). This becomes relevant if the average length of arguments is smaller than 4. Since Linux 2.6.23, this function tests if the number exceeds MAX_ARG_STRINGS in <linux/binfmts.h> (2^32-1 = 4294967296-1). And as additional limit, one argument must not be longer than MAX_ARG_STRLEN (131072).

关于linux - Bash 参数的最大数量!= max num cp arguments?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185017/

相关文章:

node.js - 允许非 root 用户 process.setuid 给某些其他用户

linux - 在 unix 上创建标记文件的最便宜的方法

linux - 如何让 Linux 等到我的程序完成其 SIGTERM 操作?

linux - 为什么在特定文件夹中找不到命令?

regex - 日志提取: SED Command

.net - 用于简化命令行参数编辑的 Visual Studio 插件

linux - 想要了解 wwan0 上传输的数据量?

bash - 在 bash 中排序 1 到 10

fortran - 英特尔Fortran--检查界限不提供行号

javascript - 如何在 eval() 中评估 console.log(1+2) ?