如何强制'cp'来覆盖目录,而不是在里面创build另一个?

我想写一个Bash脚本,将覆盖现有的目录。 所以,我有一个目录富/我正在尝试覆盖吧/与它。 但是当我这样做,

cp -Rf foo/ bar/ 

会发生什么是一个新的bar / foo /目录被创build。 我不要那个。 在foo / a和b中有两个文件。 在bar /中也有相同名称的文件。 我想要foo / a和foo / b来replacebar / a和bar / b。

你可以在cp使用-T选项来做到这一点。
请参阅手册页。

 -T, --no-target-directory treat DEST as a normal file 

所以按照你的例子,以下是文件结构。

 $ tree test test |-- bar | |-- a | `-- b `-- foo |-- a `-- b 2 directories, 4 files 

当使用-vselect详细时,可以看到明显的差异。
当你只使用-R选项。

 $ cp -Rv foo/ bar/ `foo/' -> `bar/foo' `foo/b' -> `bar/foo/b' `foo/a' -> `bar/foo/a' $ tree |-- bar | |-- a | |-- b | `-- foo | |-- a | `-- b `-- foo |-- a `-- b 3 directories, 6 files 

当使用选项-T它将覆盖内容, 将目标视为普通文件而不是目录

 $ cp -TRv foo/ bar/ `foo/b' -> `bar/b' `foo/a' -> `bar/a' $ tree |-- bar | |-- a | `-- b `-- foo |-- a `-- b 2 directories, 4 files 

这应该可以解决你的问题。

分两步做。

 rm -r bar/ cp -r foo/ bar/ 

使用这个cp命令:

 cp -Rf foo/* bar/ 

以下命令确保副本中包含点文件(隐藏文件):

 $ cp -Rf foo/. bar 

与@Jonathan Wheeler非常相似:

如果你不想记住,但不能重写bar

 rm -r bar/ cp -r foo/ !$ 

!$显示上一个命令的最后一个参数。