将数千个文件从一个目录复制到另一个目录时"Argument too long"错误



我有一个包含数千个文件的目录。我需要将所有文件从该目录复制到另一个目录。

我使用过:

cp -r dir1/* dir2/

但是我得到的错误参数太长了,但它适用于文件数量较少的目录。

这里有一个类似的问题:错误参数太长,这应该可以解决您的问题。

你应该研究一下xargs。这将多次运行命令,一次可以传递尽可能多的参数。

解决方案基本上归结为:

在 Linux 上:

ls dir1 | xargs -I {} cp {} dir2/

在 OS X 上:

ls dir1 | xargs -J {} cp {} dir2/

这将列出 dir1 中的所有文件,然后使用 xargs 捕获 ls 输出的行。然后复制每个文件。(在本地成功测试(

如果你对为什么有限制感到好奇,David在你的问题下发布了一个链接(UNIX cp限制的链接在这里(。

您可以通过以下方式找到系统上的限制:

getconf ARG_MAX

如果目录中的文件超过 ARG_MAX 的值,将生成您遇到的错误。

大卫上面提到的链接非常详细地解释了这一点,非常值得一读。总结一下,传统上Unix的限制(如getconf ARG_MAX所报告的那样(或多或少是累积大小:

  • 参数字符串的长度(包括终止的"\0"(
  • 指向这些字符串的指针数组的长度,因此在 64 位系统上每个参数通常为 8 个字节
  • 环境字符串
  • 的长度(包括终止的"\0"(,按照惯例,环境字符串类似于var=value。
  • 指向这些字符串的指针数组的长度,因此在 64 位系统上每个参数通常为 8 个字节

如果 dir2 没有必要已经存在,一个简单的解决方案可以是:

cp -r dir1 dir2

。在执行命令之前,请确保 DIR2 不存在。

最新更新