如何强制“cp”覆盖目录而不是在里面创建另一个目录?

新手上路,请多包涵

我正在尝试编写一个将覆盖现有目录的 Bash 脚本。我有一个目录 foo/ 我正在尝试用它覆盖 bar/ 。但是当我这样做时:

 cp -Rf foo/ bar/

创建一个新的 bar/foo/ 目录。我不想要那个。 foo/ 中有两个文件; abbar/ 中也有同名的文件。我想要 foo/afoo/b 替换 bar/abar/b

原文由 saketrp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 323
1 个回答

您可以使用 -T 中的 cp 选项来执行此操作。

请参阅 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

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

原文由 Saurabh Meshram 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题