【问题标题】:Override copy files using -exec cp使用 -exec cp 覆盖复制文件
【发布时间】:2018-08-07 15:33:11
【问题描述】:
mkdir zipFiles

find . -name '*.zip' -exec cp {} zipFiles/  \;

Error:
cp: ‘./zipFiles/status.zip’ and ‘zipFiles/status.zip’ are the same file

我尝试了这些命令来强制复制以覆盖现有文件,但它们都不起作用;

find . -name '*.zip' -exec cp {} zipFiles/  \;
find . -name '*.zip' -exec cp -f {} zipFiles/  \;
find . -name '*.zip' -exec cp -rf {} zipFiles/  \;
find . -name '*.zip' -exec cp {} -rf zipFiles/  \;

【问题讨论】:

  • 你可以简单地先做一个rm -rf,然后做cp -f {}——如果文件在zipFiles/目录中不存在...rm它不会失败。所以它基本上就像,“如果文件已经存在,删除它”——然后复制它..
  • @Zak 问题是find 试图复制它自己已经复制到zipFiles 的文件。删除它们并重新复制它们只会产生无限循环。
  • 问题不在于它拒绝覆盖文件。问题是您要求复制源和目标相同的文件,例如cp foo foo 这毫无意义。

标签: linux bash copy exec cp


【解决方案1】:

您不希望 find 搜索 zipFiles。一种方法是

find . -name '*.zip' \( ! -path '*/zipFiles/*.zip' \) -exec cp {} zipFiles/ \;

为了加快速度,使用-exec ... +cp 一次复制尽可能多的文件。要么

find . ... -exec sh -c 'cp "$@" zipFiles' _ {} +

或者,如果您使用的是 GNU cp

find . ... -exec cp -t zipFiles {} +

【讨论】:

  • 这是另一种情况,当我尝试将所有 shell 文件复制到一个文件夹时,它正在复制没有任何问题,但它需要更多时间。有没有什么方法可以复制速度非常快。这是我尝试过的“find . -iname "*.sh" -exec cp {} shellFiles \; "
  • 没关系,我明白了。我应用了类似的命令,效果好多了。
  • 我正在尝试在下面的命令中使用反斜杠,以 groovy 语法: find 。 -name '.zip' (!-path '*/zipFiles/.zip') -exec cp {} zipFiles/ \;当我尝试在 Jenkins 管道上构建此命令时,给我一个有关此语法的错误。甚至在我执行此命令之前,Jenkins 表单字段上就有一个带有红色语法的警告,说 unexpected char: '\'。 我可以用这个反斜杠替换或修复错误吗?寻找 。 -name '.zip' (!-path '*/zipFiles/.zip') -exec cp {} zipFiles/ \;
  • 通过添加一个额外的 "\" find 解决了这个问题。 -name '.zip' \\( !-path '*/zipFiles/.zip' \\) -exec cp {} zipFiles/ \\;
【解决方案2】:

您可以使用 rsync 命令:

rsync 源目标

rsync --force 源目标

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2011-09-02
    • 2011-05-12
    • 2014-08-13
    • 2015-04-05
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多