Как мне скопировать каталог в себя?

Я могу скопировать каталог следующим образом:

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

Аналогично, если бы я просто хотел скопировать файлы из каталога, я мог бы сделать это:

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

Вещи стать немного сложнее, если я захочу скопировать исходный каталог в целевой каталог, который является подкаталогом источника. т.е. скопировать каталог в себя. Например:

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

выдает следующую ошибку: cp: не может скопировать каталог './Desktop/' в себя, './Desktop/sub/'

This можно немного обойти, используя extglob, например:

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

Однако эта последняя команда зависит от уже существующего каталога sub .

Как вы можете скопировать каталог в себя таким образом, чтобы команда, создавшая его, одновременно создавала подкаталог?

6
задан 2 August 2017 в 20:02

2 ответа

Используйте 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/
10
ответ дан 3 August 2017 в 06:02

Можно всегда использовать /tmp для передачи. (without 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
~$
1
ответ дан 23 November 2019 в 07:28

Другие вопросы по тегам:

Похожие вопросы: