Linux如何复制但不能覆盖?

mno*_*tka 349 linux bash cp

我想要cp一个目录,但我不想覆盖任何现有的文件,即使它们比复制的文件旧.而且我想完全不受欢迎,因为这将是Crontab Bash脚本的一部分.有任何想法吗?

hov*_*yan 534

摘自手册页:

-n, --no-clobber
              do not overwrite an existing file (overrides a previous -i option)
Run Code Online (Sandbox Code Playgroud)

例:

cp -n myoldfile.txt mycopiedfile.txt
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果文件存在,这将退出并显示错误.要成功退出,请尝试```cp -n source.txt destination.txt || true``` (25认同)
  • 如果Ubuntu 12.04上存在该文件,则@galenandrew`cp -n`不会退出并显示错误. (11认同)
  • 这可以递归吗?说,用`-Rn`? (2认同)
  • 即使使用 Ubuntu 18.04,行为也是相同的,当文件存在时,命令退出而不会出现错误,即无操作!这很危险! (2认同)

Han*_*zel 82

考虑使用rsync.

rsync -a -v --ignore-existing src dst
Run Code Online (Sandbox Code Playgroud)

根据评论rsync -a -v src dst不正确,因为它将更新现有文件.

  • 您想要添加`--ignore-existing`标志以防止覆盖现有文件. (7认同)
  • 完整的命令`rsync -a -v --ignore-existing <src> <dst>`确实是正确的答案,而不是`cp -u`above. (7认同)
  • 绝对地。我不想将 `rsync` 安装到我的 docker 容器中,只是为了做一个副本!我无法想象当 BB 枪就足够的时候我们为什么要使用大炮。 (2认同)

小智 49

cp -n
Run Code Online (Sandbox Code Playgroud)

是你想要的.请参见手册页.

  • “查看手册页”不是可接受的答案,请提供文档链接或引用。 (9认同)

Gri*_*... 32

对于发现没有'n'选项的人(比如我在RedHat上),cp -u如果源比现有源更新(或者没有现有源),则可以使用仅写入文件.

[编辑]如评论中所述,这将覆盖旧文件,因此不是OP想要的.使用ceving的答案.

  • OP要求不要覆盖现有文件**,即使它们比复制文件更旧**,所以`-u`实际上并不适合. (9认同)
  • 天哪,你是对的.我很惊讶花了这么长时间才让人注意到. (4认同)
  • 我很高兴六年前我能提供帮助:-D (2认同)

cev*_*ing 30

这将适用于RedHat:

false | cp -i source destination 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

更新不是覆盖是不同的.

  • @FrozenFlame回答`-i`问题. (11认同)
  • 同样显然,如果地球撞上太阳,这个命令将不起作用。 (7认同)
  • "假"在这做什么? (3认同)
  • 这适用于busybox cp. (3认同)
  • 显然,如果您尝试复制超过 ARG_MAX 个文件,则此命令将不起作用。要解决这种情况,请检查此[链接](http://unix.stackexchange.com/a/110285)。 (2认同)

Kam*_*ski 8

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

if [ ! -f env.js ]; then cp env.example.js env.js; fi 
Run Code Online (Sandbox Code Playgroud)

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


Shō*_*un8 5

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

  echo n | cp -vipr src/* dst
Run Code Online (Sandbox Code Playgroud)