我正在尝试编写一个覆盖现有目录的Bash脚本。所以,我有一个目录foo /,我试图用它覆盖bar /。但是当我这样做时,
cp -Rf foo/ bar/
会发生一个新的bar / foo /目录。我不希望这样。 foo / a和b中有两个文件。 bar /中也有同名文件。我希望foo / a和foo / b替换bar / a和bar / b。
答案 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/
本身。
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