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
,他将再次面临同样的问题