【问题标题】:Copying all *.mp4 (for example) to somewhere将所有 *.mp4(例如)复制到某处
【发布时间】:2025-11-21 22:40:02
【问题描述】:

我正在尝试将某种类型的所有文件复制到一个文件夹及其子文件夹中! 我知道cp /source/path /path/to/destination_path。 我知道find . -name "*.mp4"

我试过cp "$(find . -name "*.mp4")" /path/to/destination。虽然问题似乎是,但 find 将结果放在一个字符串中。

你有什么解决办法吗?提前致谢。 :)

【问题讨论】:

  • 您希望将它们复制到目标中的相应子文件夹中,还是直接复制到目标文件夹中?
  • 直接在目标文件夹中
  • @CharlesDuffy 我看不出区别。如果他想不止一次这样做,或者可能作为更大脚本的一部分,它是否符合主题?看起来这只是虚无缥缈,直接的问题本身就是一个更好的 SSCCE。
  • @Paulpro, ...我通常根据他们是否专注于交互使用来将问题重定向到 Unix SE 或 SU。例如,历史扩展问题是明确的:脚本中甚至根本没有默认启用该功能。另一方面是关于以编程方式从 JSON 中迭代内容的问题,或影响变量范围的隐式子流程等问题——这些毫无疑问是开发问题。诚然,这个有点模糊,我做出了判断——尽管我确实认为它是正确的。
  • @Paulpro,...从字面上回答您的问题,但是:“如果他想不止一次这样做,[...] 它会成为主题吗?”,答案是不,至少不是在那些理由上——我们之前已经在元数据上讨论过了;附加了“在脚本中”的离题问题仍然是离题问题,除非自动化手头过程的行为本身引发了一个新问题。 部分一点也不模糊。

标签: bash


【解决方案1】:

如果您想保留文件夹结构,请考虑rsync

rsync -r --include='*.mp4' --exclude='*' . /path/to/destination

如果你不需要保留结构--

在 GNU 系统(具有非标准扩展名 cp -t)上,您可以通过一种方式执行此操作,而不是运行尽可能少的 cp 实例:

find . -name '*.mp4' -exec cp -t /path/to/destination -- '{}' +

否则,在符合 POSIX 的格式中,每个文件找到一个 cp

find . -name '*.mp4' -exec cp -- '{}' /path/to/destination/ ';'

【讨论】:

    【解决方案2】:

    输出结果为一个字符串,因为您在 find 结果中有引号。

    要为每个find 结果执行命令,请改用-exec(适用于GNU bashfind):

    find -name "*.mp4" -exec cp {} /path/to/destination/ \;
    

    【讨论】:

    • 仅供参考,不为find 命名位置进行搜索的能力是 GNU 主义;为了获得最大的兼容性,.(或其他一些起始位置)应该被明确命名。
    • (特别是因为这里的 OP 没有cp -t,所以它们可能位于非 Linux 平台上——或者具有 Linux 内核但非 GNU 工具的平台上——所以可移植性是一个问题)。
    • @CharlesDuffy 有趣。我想知道您是如何发现 OP 没有 cp -t
    • 因为 POSIX 方法是我回答中唯一对他们有用的方法...
    • @CharlesDuffy 哈哈。无论如何,我建议尽可能符合标准,但有时方言会使手头的任务更容易。