仅当文件不存在时才将目录结构中的每个文件复制到特定路径中

仅当文件不存在时才将目录结构中的每个文件复制到特定路径中

仅当文件不存在时才将目录结构中的每个文件复制到特定目录。

第一部分来自这个 Stack Overflow 问题

find . -type f -exec cp {} /target-directory \;

我如何检查文件是否存在?如果不存在,则复制文件,否则跳过。

答案1

您可以使用-uswitch fromcp命令:

仅当源文件比目标文件新或目标文件丢失时才复制

或者使用rsync命令--ignore-existing

跳过更新接收器上存在的文件

例子:

rsync --ignore-existing source/* destination/

答案2

您的原始命令可以重写为:

find . -type f -exec bash -c 'test -e /target-directory/"$1" || cp "$1" /target-directory' sh {} \;

这里的关键是我们用特定命令调用 shell,并将找到的文件作为$1参数传递。如果test -e /target-directory/"$1"失败,则意味着文件不存在,在这种情况下cp将复制该文件。

一般来说,可以使用其他命令,只要该命令可以验证文件的存在即可。其他一些替代方案:

  • /usr/bin/realpath -e /target-directory/"$1" > /dev/null || cp "$1" /target-directory
  • stat >/dev/null /target-directory/"$1" || cp "$1" /target-directory/"$1"

答案3

阅读man cp,并使用--no-clobber选项cp

相关内容