66

如果我运行命令mv folder2/*.* folder,我会收到“参数列表太长”错误。

我找到了一些 and 的例子lsrm处理这个错误,使用find folder2 -name "*.*". 但我无法将它们应用于mv.

4

6 回答 6

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

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

于 2012-08-13T21:18:33.593 回答
30

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

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

# Using xargs
find folder2 -name '*.*' | xargs mv --target-directory=folder
于 2012-08-13T21:44:09.390 回答
4

find folder2 -name '*.*' -exec mv \{\} /dest/directory/ \;

于 2012-08-13T21:18:32.113 回答
3

首先,感谢卡尔的回答。我对此只有轻微的修正。

我的场景:

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

为此,我使用这样的命令:

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

这里:

  • -mindepth 1 :确保不移动根文件夹
  • -maxdepth 1 :确保只搜索一级子级。所以它的所有内容也会被移动,但你不需要搜索它。

上面答案中建议的命令使结果目录结构变平 - 这不是我想要的,所以决定分享我的方法。

于 2018-08-21T10:14:13.983 回答
2

这个单行命令应该适合您。是的,它很慢,但即使处理数百万个文件也可以。

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

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

于 2019-08-08T17:24:56.893 回答
1

find不适用于非常长的文件列表,它会给你同样的错误“参数列表太长”。结合使用lsgrepxargs对我有用:

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

它成功地移动了大约 50,000 个文件,其中 mv 和 find 单独失败。

于 2019-08-07T16:03:54.270 回答