关于bash:Linux如何复制但不能覆盖?

Linux how to copy but not overwrite?

我想要一个目录,但是我不想覆盖任何现有的文件,即使它们比复制的文件旧。我想做的完全没有吸引力,因为这将是crontab bash脚本的一部分。有什么想法吗?


摘自手册页:

1
2
-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)

例子:

1
cp -n myoldfile.txt mycopiedfile.txt


考虑使用rsync

1
rsync -a -v --ignore-existing src dst

根据注释,rsync -a -v src dst不正确,因为它将更新现有文件。


1
cp -n

是你想要的。参见手册页。


对于那些发现没有"n"选项的人(比如我在Redhat上),您可以使用cp -u只在源文件比现有文件更新(或者没有现有文件)时写入文件。

[编辑]正如评论中提到的,这将覆盖旧的文件,因此这不是OP想要的。用塞文的答案。


这将适用于RedHat:

1
false | cp -i source destination 2>/dev/null

更新和不覆盖是不同的。


AlpineLinux:下面的答案只适用于单一文件的情况:在Alpinecp -n中,它不工作(而且false | cp -i ...也不工作),所以在我的案例中,我发现的解决方案是:

1
if [ ! -f env.js ]; then cp env.example.js env.js; fi

在上面的例子中,我们检查env.js文件是否存在,如果不存在,我们将env.example.js复制为env.js