仅当文件不存在时才将目录结构中的每个文件复制到特定目录。
第一部分来自这个 Stack Overflow 问题:
find . -type f -exec cp {} /target-directory \;
我如何检查文件是否存在?如果不存在,则复制文件,否则跳过。
答案1
您可以使用-u
switch 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
。