如何将目录复制到其自身?

如何将目录复制到其自身?

我可以复制如下目录:

~$ cp -r ./Desktop/ /tmp/

类似地,如果我只是想从目录中复制文件,我可以这样做:

~$ cp -r ./Desktop/. /tmp/

如果我想将源目录复制到目标目录(即源目录的子目录),事情就会变得有点棘手。即将目录复制到其自身中。例如:

~$ cp -r ./Desktop/ ./Desktop/sub/

会抛出以下错误:cp: 无法将目录 './Desktop/' 复制到其自身 './Desktop/sub/'

可以使用 extglob 稍微解决这个问题,如下所示:

~$ cp -r ./Desktop/!(sub) ./Desktop/sub/

但是,最后一个命令依赖于目录已经存在。

如何将一个目录复制到其自身中,以便执行此操作的命令同时创建子目录?

答案1

使用rsync而不是cp

rsync -Rr ./Desktop/ ./Desktop/sub/

让我们测试一下:

$ cd /tmp
$ mkdir -p Desktop/sub
$ touch Desktop/a-file
$ ls -F Desktop
a-file sub/
$ cp ./Desktop ./Desktop/sub
cp: cannot copy a directory, './Desktop', into itself, './Desktop/sub/Desktop'

但是rsync可以正常工作:

$ rsync -Rr ./Desktop/ ./Desktop/sub/
$ ls -F Desktop/sub/
Desktop/

答案2

您始终可以使用/tmp进行传输。(无rsync

~$ ls
1  2  3  a  b  c  ddd  w  wow
~$ cp -r . /tmp/TEMP
~$ mv /tmp/TEMP copy_dir
~$ ls
1  2  3  a  b  c  copy_dir  ddd  w  wow
~$ ls copy_dir/
1  2  3  a  b  c  ddd  w  wow

或者,创建一个函数:

function cpc() { cp -r . /tmp/cpc-$1 && mv /tmp/cpc-$1 .; }

像这样:

~$ function cpc() { cp -r . /tmp/cpc-$1 && mv /tmp/cpc-$1 .; }
~$ ls
1  2  3
~$ cpc hhh
~$ ls hhh
1  2  3
~$ ls
1  2  3  hhh
~$

相关内容