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

时间:2014-05-16 14:43:48

标签: linux bash shell command-line cp

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

cp -Rf foo/ bar/

会发生一个新的bar / foo /目录。我不希望这样。 foo / a和b中有两个文件。 bar /中也有同名文件。我希望foo / a和foo / b替换bar / a和bar / b。

9 个答案:

答案 0 :(得分:85)

您可以使用-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作为详细信息时,您可以看到明显的区别 当您仅使用-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

这可以解决您的问题。

答案 1 :(得分:32)

分两步完成。

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

答案 2 :(得分:13)

如果您想确保bar/的结局与foo/相同,请改用rsync

rsync -a --delete foo/ bar/

如果只有几处更改,则执行起来比删除并重新复制整个目录要快得多。

  • -a是“归档模式”,它将如实地将foo/中的文件复制到bar/
  • --delete也会从foo/中删除不在bar/中的多余文件,以确保bar/最终相同
  • 如果您想查看它在做什么,请添加-vh以表示冗长且易于理解
  • 注意:必须在foo之后加上斜杠,否则rsync会将foo/复制到bar/foo/而不是覆盖bar/本身。
    • (rsync中的目录后的斜杠令人困惑;如果您感兴趣的话,这是瓢。它们告诉rsync引用目录的 contents ,而不是目录 itself < / em>。因此要从foo/内容覆盖到bar/的内容,我们在两者上都使用斜杠,这很令人困惑,因为它无法按预期工作在都不上加上斜杠; rsync总是毫不费力地将目标路径解释为带有斜杠,即使它在源路径上没有斜杠也是如此。因此我们需要在斜杠上加上斜杠如果我们要将foo/内容复制到bar/而不是目录{{1中,请使其与目标路径上自动添加的斜杠相匹配。 }}本身以foo/的身份登陆bar/。)

bar/foo非常强大且有用,如果您好奇地看看它还能做什么(例如通过ssh复制)。

答案 3 :(得分:10)

使用此cp命令:

cp -Rf foo/* bar/

答案 4 :(得分:7)

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

$ cp -Rf foo/. bar

答案 5 :(得分:3)

与@Jonathan Wheeler非常相似:

如果您不想记住,而不是重写bar

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

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

答案 6 :(得分:0)

您定义的操作是“合并”,您无法使用cp进行操作。但是,如果您不希望合并并且可以丢失文件夹bar,则可以简单地rm -rf bar删除文件夹,然后mv foo bar重命名。这不会花费任何时间,因为这两个操作都是通过文件指针而不是文件内容完成的。

答案 7 :(得分:0)

尝试使用由两个步骤组成的命令:

rm -rf bar && cp -r foo bar

答案 8 :(得分:0)

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: exmaple-pvc
spec:
  accessModes:
    - ReadOnlyMany
    - ReadWriteMany
  storageClassName: standard
  volumeMode: Filesystem
  resources:
    requests:
      storage: 1Gi