【问题标题】:Moving large number of files [duplicate]移动大量文件[重复]
【发布时间】:2012-08-10 03:52:40
【问题描述】:

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

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

【问题讨论】:

  • 在 S.O. 上提出并回答了这个问题。每周一次。提问前请先学习如何搜索。祝你好运。
  • @shellter 我确实找到了一些类似的例子,但正如我所说,它们都是lsrm 的例子。
  • @shellter,如果有这么多重复,找到一个并投票关闭。

标签: bash


【解决方案1】:
find folder2 -name '*.*' -exec mv {} folder \;

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

【讨论】:

  • 感谢您的回答,我想知道 mv 可以移动多少个文件。mv 工作的文件数限制是多少。
  • @Thunder,不确定确切的限制,但 mv 包含 22,897 个文件的文件夹失败。
  • 成功:在 Ubuntu 18.04 上测试,移动了 800,000 多个文件。运行了一段时间,但完美地完成了这项工作。
  • macOS Catalina 10.15 也成功
【解决方案2】:

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

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

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

【讨论】:

  • 正常同意,但如果直接 mv 生成“参数列表太长”错误,我怀疑使用 find 构建的一样长的错误会起作用。
  • 我不确定我是否遵循。这就是find 末尾的+ 的全部意义所在。如果你使用它,find 的行为与 find | xargs 组合完全相同。
  • 当 OP 试图一次移动所有文件时,shell 出错。 findxargs 最终都会运行相同的 shell 命令来实际执行移动,因此它们也可能会出错。这就是为什么我建议使用一次一次的方法,即使它比较慢。
  • 我建议您阅读find ... +xargs 的工作原理。它们的设计目的是为了将足够的参数传递给命令,以便参数列表永远不会“太长”。因此,他们可能会使用不同的参数多次调用该命令。对于每个这样的调用,参数列表的长度永远不会超过系统限制。
  • 无法让这些命令中的任何一个工作......也许是旧模式或其他东西,但这对我来说在 Mac 上有效:find source_folder -name "*.jpg" -exec mv {} destination_folder \;
【解决方案3】:

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

【讨论】:

  • 您是否真的要在此处移动名为“{}”的文件名?为什么是反斜杠?不确定这是一个合法的答案..?
【解决方案4】:

首先,感谢 Karl 的回答。我对此只作了小幅修正。

我的场景:

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

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

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

这里:

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

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

【讨论】:

    【解决方案5】:

    这个单行命令应该适合你。 是的,它很慢,但即使处理数百万个文件也能正常工作。

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 2020-02-26
        • 2013-05-26
        • 2018-09-05
        • 1970-01-01
        • 2016-07-17
        • 2018-11-15
        • 1970-01-01
        • 2019-02-12
        相关资源
        最近更新 更多