用 cp 覆盖现有文件夹

use*_*723 7 command-line cp

是否可以使用 cp 覆盖现有文件夹?例子:

tux@linux:~ $ cd /tmp/test/
tux@linux:/tmp/test $ mkdir A
tux@linux:/tmp/test $ cd A
tux@linux:/tmp/test/A $ touch 1 2 3 4
tux@linux:/tmp/test/A $ cd ..
tux@linux:/tmp/test $ cp -R A A.bak
tux@linux:/tmp/test $ tree
.
??? A
?   ??? 1
?   ??? 2
?   ??? 3
?   ??? 4
??? A.bak
    ??? 1
    ??? 2
    ??? 3
    ??? 4

2 directories, 8 files
tux@linux:/tmp/test $ touch A/5
tux@linux:/tmp/test $ tree
.
??? A
?   ??? 1
?   ??? 2
?   ??? 3
?   ??? 4
?   ??? 5
??? A.bak
    ??? 1
    ??? 2
    ??? 3
    ??? 4

2 directories, 9 files
tux@linux:/tmp/test $ cp -R A A.bak
tux@linux:/tmp/test $ tree
.
??? A
?   ??? 1
?   ??? 2
?   ??? 3
?   ??? 4
?   ??? 5
??? A.bak
    ??? 1
    ??? 2
    ??? 3
    ??? 4
    ??? A
        ??? 1
        ??? 2
        ??? 3
        ??? 4
        ??? 5

3 directories, 14 files
Run Code Online (Sandbox Code Playgroud)

但它应该是:

.
??? A
?   ??? 1
?   ??? 2
?   ??? 3
?   ??? 4
?   ??? 5
??? A.bak
    ??? 1
    ??? 2
    ??? 3
    ??? 4
    ??? 5

2 directories, 10 files
Run Code Online (Sandbox Code Playgroud)

Rah*_*hul 6

这就是您正在寻找的

cp -TRv A A.bak
Run Code Online (Sandbox Code Playgroud)

当您使用该选项时-T,它会覆盖内容,将目标视为普通文件而不是目录。

man cp

-T, --no-target-directory
    treat DEST as a normal file

-v, --verbose
          explain what is being done
Run Code Online (Sandbox Code Playgroud)

或者,您复制目录的内容而不是目录,如下所示:

cp -TR A/* A.bak
Run Code Online (Sandbox Code Playgroud)