Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 移动大量文件_Bash - Fatal编程技术网

Bash 移动大量文件

Bash 移动大量文件,bash,Bash,如果运行命令mv folder2/*.*folder,则会出现“参数列表过长”错误 我找到了一些ls和rm的示例,它们使用find folder2-name“*.*”处理这个错误。但是我很难将它们应用于mv查找folder2-name'*.'-exec mv\{\}/dest/directory/\ find folder2 -name '*.*' -exec mv {} folder \; -exec运行任何命令,{}插入找到的文件名,\标志着exec命令的结束。另一个find答案可以工作,

如果运行命令mv folder2/*.*folder,则会出现“参数列表过长”错误


我找到了一些
ls
rm
的示例,它们使用
find folder2-name“*.*”
处理这个错误。但是我很难将它们应用于
mv
查找folder2-name'*.'-exec mv\{\}/dest/directory/\

find folder2 -name '*.*' -exec mv {} folder \;

-exec
运行任何命令,
{}
插入找到的文件名,
\
标志着exec命令的结束。

另一个
find
答案可以工作,但是对于大量文件来说速度非常慢,因为它们对每个文件执行一个命令。更有效的方法是在
find
末尾使用
+
,或者使用
xargs

# Using find ... -exec +
find folder2 -name '*.*' -exec mv --target-directory=folder '{}' +

# Using xargs
find folder2 -name '*.*' | xargs mv --target-directory=folder

首先,感谢卡尔的回答。对此我只有一点小小的修正

我的场景:

/source/directory中有数百万个文件夹,其中包含子文件夹和文件。目标是复制它,保持相同的目录结构

为此,我使用以下命令:

find /source/directory -mindepth 1 -maxdepth 1 -name '*' -exec mv {} /target/directory \;
在这里:

  • -mindepth 1:确保不移动根文件夹
  • -maxdepth 1:确保只搜索第一级子级。所以它的所有内容也会被移动,但你不需要搜索它
上面答案中建议的命令使结果目录结构扁平化,而这不是我想要的,所以决定分享我的方法。

find不能处理很长的文件列表,它会给你同样的错误“参数列表太长”。使用ls、grep和xargs的组合对我来说很有效:

$ls | grep RadF | xargs mv-t../fd/


它成功地移动了大约50000个文件,而mv和find都失败了

这个一行命令应该适合您。 是的,它相当慢,但即使处理数百万个文件也能工作

for i in /folder1/*; do mv "$i" /folder2; done

它会将所有文件从文件夹
/folder1
移动到
/folder2

这个问题每周都会在S.O.上询问和回答。询问前请先了解如何搜索。祝你好运。@Sheller我确实找到了一些类似的例子,但正如我所说的,它们都是
ls
rm
@Sheller的例子,如果有这么多DUP,请找到一个并投票关闭。正常情况下同意,但如果直接的
mv
生成“参数列表过长”错误,我怀疑使用
find
构建的一个同样长的应用程序是否有效。我不确定我是否会遵循。这就是
find
末尾的
+
的全部要点。如果使用该选项,
find
的行为与
find | xargs
组合完全相同。当OP试图同时移动所有文件时,shell出错。
find
xargs
最终都会运行相同的shell命令来实际执行移动,因此它们也可能出错。这就是为什么我建议使用一次一个的方法,尽管速度较慢。我建议您阅读如何
find+
xargs
工作。它们的设计完全是为了向命令传递足够的参数,这样参数列表就不会“太长”。因此,它们可能会使用不同的参数多次调用该命令。对于每次这样的调用,参数列表的长度永远不会超过系统限制。无法使这些命令中的任何一个正常工作。。。也许是一个旧的模式或什么的,但这对我在Mac上很有用:
find source_folder-name“*.jpg”-exec mv{}destination_folder\谢谢你的回答,我想知道mv可以移动多少个文件。mv工作的文件数限制是多少。@Thunder,不确定确切的限制,但是
mv
一个包含22897个文件的文件夹失败了。成功:在Ubuntu 18.04上测试,移动800000多个文件。运行了一段时间,但工作做得很完美。macOS Catalina 10.15上的成功。您是否确实尝试将名为“{}”的文件名移动到此处?为什么是反斜杠?不确定这是不是一个利吉特的答案。。?