Я могу скопировать каталог следующим образом:
~$ 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 .
Как вы можете скопировать каталог в себя таким образом, чтобы команда, создавшая его, одновременно создавала подкаталог?
Используйте 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/
Можно всегда использовать /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
~$