如何强制'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
当使用-v
select详细时,可以看到明显的差异。
当你只使用-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/ !$
!$
显示上一个命令的最后一个参数。