我正在尝试编写一个覆盖现有目录的 Bash 脚本。我有一个目录 foo/
,我试图用它覆盖 bar/
。但是当我这样做时:
cp -Rf foo/ bar/
一个新的 bar/foo/
目录被创建。我不想要那个。 foo/
中有两个文件; a
和 b
。 bar/
中也有同名的文件。我希望 foo/a
和 foo/b
替换 bar/a
和 bar/b
。
最佳答案
您可以使用 cp
中的 -T
选项来执行此操作。
请参阅 cp
的手册页。
-T, --no-target-directory
treat DEST as a normal file
所以按照你的例子,下面是文件结构。
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
当您使用 -v
表示 Verbose 时,您可以看到明显的区别。
当你只使用 -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
这应该可以解决您的问题。
关于linux - 如何强制 'cp' 覆盖目录而不是在里面创建另一个目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23698183/