Linux &引用;“争论太长”;将数千个文件从一个目录复制到另一个目录时出错

Linux &引用;“争论太长”;将数千个文件从一个目录复制到另一个目录时出错,linux,bash,Linux,Bash,我有一个包含数千个文件的目录。我需要将所有文件从该目录复制到另一个目录 我用过: cp-r dir1/*dir2/ 但我得到的错误参数太长,但它适用于文件数较少的目录。如果dir2不一定已经存在,一个简单的解决方案可以是: cp -r dir1 dir2 。。。在执行命令之前,请确保dir2不存在 这里有一个类似的问题:,这应该可以解决您的问题 你应该调查一下。这将运行一个命令几次,一次可以传递多少个参数 解决方案基本上归结为: 在Linux上: ls dir1 | xargs -I {} c

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

我用过:

cp-r dir1/*dir2/


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

如果dir2不一定已经存在,一个简单的解决方案可以是:

cp -r dir1 dir2

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

这里有一个类似的问题:,这应该可以解决您的问题

你应该调查一下。这将运行一个命令几次,一次可以传递多少个参数

解决方案基本上归结为:

在Linux上:

ls dir1 | xargs -I {} cp {} dir2/
在OS X上:

ls dir1 | xargs -J {} cp {} dir2/
这将列出dir1中的所有文件,然后使用xargs捕捉ls输出的行。然后复制每个文件。(本地测试成功)

如果你想知道为什么在你的问题()下会有一个链接

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

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

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

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

看看你已经超过了
ARG_MAX
,你可以用
getconf ARG_MAX
来检查,如果这个答案解释了为什么会有一个好的点,我会研究它!请看我在该问题下的评论,它提供了一个指向unix.stackexchange.Thank@DavidC.Rankin上答案的链接!问题是他的目录中的文件超过了导致错误的
ARG_MAX
文件,而不是他调用
cp
的方式。您是对的。。。这就是问题所在。我只是给出了一个可能的解决方案,避免了全球化。无论你是否使用*都会有所不同
find/path/to/fies-type f-print0
xargs
一起使用通常是一个很好的解决方案,或者是dir/*中文件的
;执行cp文件dir2;在读取过程中完成
或执行,并使用进程替换可以工作。@DavidC.Rankin:是的,还有其他解决方案。。。请你不要回答这个问题,“你是否使用*会有区别”——确实如此。OP希望文件在
dir2
中,您的解决方案在
dir2
中为他提供
dir1
(带文件)。如果他试图直接将文件从subdir向上移动到
dir2
,他将再次面临同样的问题