sak*_*trp 83 linux bash shell command-line cp
我正在尝试编写一个覆盖现有目录的Bash脚本.所以,我有一个目录foo /,我试图用它覆盖bar /.但是当我这样做的时候
cp -Rf foo/ bar/
Run Code Online (Sandbox Code Playgroud)
会发生什么是创建一个新的bar/foo /目录.我不希望这样.foo/a和b中有两个文件.bar /中也有同名文件.我希望foo/a和foo/b替换bar/a和bar/b.
Sau*_*ram 99
您可以使用-T选项执行此操作cp.
请参阅手册页cp.
-T, --no-target-directory
treat DEST as a normal file
Run Code Online (Sandbox Code Playgroud)
因此,根据您的示例,以下是文件结构.
$ tree test
test
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Run Code Online (Sandbox Code Playgroud)
当您使用-vVerbose 时,您可以看到明显的区别.
当你只使用-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
Run Code Online (Sandbox Code Playgroud)
当您使用该选项时,-T它会覆盖内容,将目标视为普通文件,而不是目录.
$ cp -TRv foo/ bar/
`foo/b' -> `bar/b'
`foo/a' -> `bar/a'
$ tree
|-- bar
| |-- a
| `-- b
`-- foo
|-- a
`-- b
2 directories, 4 files
Run Code Online (Sandbox Code Playgroud)
这应该可以解决您的问题.
Jon*_*ler 37
分两步完成.
rm -r bar/
cp -r foo/ bar/
Run Code Online (Sandbox Code Playgroud)
Tom*_*ter 30
如果你想确保bar/最终相同foo/,请使用rsync:
rsync -a --delete foo/ bar/
Run Code Online (Sandbox Code Playgroud)
如果只是改变了一些事情,这将比删除和重新复制整个目录快得多.
-a是'归档模式',忠实地复制文件foo/到bar/--delete不删除多余的文件,foo/从bar/为好,以确保bar/最终一致-vh详细和人性化的内容foo是必需的,否则rsync将复制foo/到bar/foo/而不是覆盖bar/自身.
foo/到的内容bar/,我们两者都使用斜杠.它很混乱,因为它不会像预期的那样工作,但两者都没有斜线; rsync偷偷地总是将目标路径解释为有一个斜杠,即使它尊重源上没有斜杠路径.因此,我们需要的源路径上的斜线,使之匹配自动添加斜线目标路径上,如果我们想将复制内容的foo/进入bar/,而不是目录foo/本身落地成bar/的bar/foo.)rsync 是非常强大和有用的,如果你好奇地看看它能做什么(比如复制ssh).
anu*_*ava 12
使用此cp命令:
cp -Rf foo/* bar/
Run Code Online (Sandbox Code Playgroud)
以下命令确保副本中包含dotfiles(隐藏文件):
$ cp -Rf foo/. bar
Run Code Online (Sandbox Code Playgroud)
与@Jonathan Wheeler 非常相似:
如果你不想记住,但不想重写bar:
rm -r bar/
cp -r foo/ !$
Run Code Online (Sandbox Code Playgroud)
!$ 显示上一个命令的最后一个参数。