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


8

仅在文件不存在的情况下才想将其从目录结构复制到特定目录。

得到了这个堆栈溢出问题的第一部分:

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

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


您的意思是“将源树中的所有文件复制到一个(没有子目录的)特定目录中”?还是“将源树中的所有文件复制到目标目录的子目录中,类似于源树中的子目录”?我以第一种情况阅读了该问题-您可以编辑该问题进行澄清吗?(我知道您有您的答案,但是其他人会读取和使用它。)
Volker Siegel

Answers:


13

您可以使用-uswitch from cp命令:

仅在SOURCE文件比目标文件新或缺少目标文件时复制

或在以下rsync命令中使用命令--ignore-existing

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

例:

rsync --ignore-existing source/* destination/

3

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

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"

2
为什么stat要在Bash中测试文件是否存在?会不会test -e简单得多?
David Foerster

@DavidFoerster没有特别的原因。测试命令也可以。如果我没有忘记,我会稍后编辑答案
Sergiy Kolodyazhnyy

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.