我有一个包含数千个文件的目录。我需要将所有文件从该目录复制到另一个目录。
我使用过:
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 不存在。