"争论时间过长"将数千个文件从一个目录复制到另一个目录时出错

时间:2016-02-12 08:18:25

标签: linux bash

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

我用过:

cp -r dir1/* dir2/

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

2 个答案:

答案 0 :(得分:0)

如果dir2不再存在,那么一个简单的解决方案可能是:

cp -r dir1 dir2

...确保在执行命令之前dir2不存在。

答案 1 :(得分:0)

此处存在类似问题:Error Argument too long,这可以解决您的问题。

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

  

解决方案基本上归结为:

     

在Linux上:

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

在OS X上:

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

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

如果您对为什么有限制David在您的问题(link here for UNIX cp limit)下发布了一个链接感到好奇。

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

getconf ARG_MAX

如果您目录中的文件超过ARG_MAX的值,则会生成您的错误。

David提到的链接非常详细地解释了这一点,非常值得一读。总结是传统上Unix的限制(由getconf ARG_MAX报告)或多或少地取决于累积大小:

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