460

我想要cp一个目录,但我不想覆盖任何现有文件,即使它们比复制的文件旧。我想做到完全非交互式,因为这将是 Crontab Bash 脚本的一部分。有任何想法吗?

4

8 回答 8

701

取自手册页

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

例子:

cp -n myoldfile.txt mycopiedfile.txt
于 2012-02-22T10:12:11.933 回答
123

考虑使用rsync.

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

根据评论rsync -a -v src dst是不正确的,因为它会更新现有文件。

于 2014-08-16T17:45:51.677 回答
55
cp -n

是你想要的。请参阅手册页。

于 2012-02-22T10:11:25.880 回答
37

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

[编辑] 正如评论中提到的,这将覆盖旧文件,所以并不是 OP 想要的。使用 ceving 的答案。

于 2013-06-04T16:45:25.763 回答
36

这将适用于 RedHat:

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

更新不覆盖是不同的。

于 2013-11-15T09:20:21.240 回答
13

Alpine linux:下面的答案仅适用于单个文件的情况:在 alpine 中cp -n不起作用(false | cp -i ...也不起作用),所以在我发现的情况下工作的解决方案是:

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

在上面的例子中,如果env.js文件不存在,那么我们复制env.example.jsenv.js.

于 2017-05-11T19:55:11.640 回答
5

某些版本的 cp 没有--no-clobber选项。在这种情况下:

  echo n | cp -vipr src/* dst
于 2019-07-22T20:47:42.353 回答
-2

这对我有用 cp -i src 目标

于 2020-08-27T04:24:29.217 回答