web-dev-qa-db-fra.com

Comment copier un répertoire dans lui-même?

Je peux copier un répertoire comme suit:

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

De même, si je voulais simplement copier les fichiers depuis un répertoire, je pouvais le faire:

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

Les choses deviennent un peu plus délicates si je veux copier le répertoire source dans un répertoire cible, c'est-à-dire un sous-répertoire de la source. c'est-à-dire copier un répertoire dans lui-même. Par exemple:

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

Lance l'erreur suivante: cp: impossible de copier un répertoire './Desktop/' dans lui-même, './Desktop/sub/'

Cela peut être circumnavigué, un peu, en utilisant extglob, comme ceci:

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

Cependant, cette dernière commande dépend du répertoire sub déjà existant.

Comment pouvez-vous copier un répertoire sur lui-même, de manière à ce que la commande crée le sous-répertoire en même temps?

6
Andrew Hardiman

Utilisez rsync au lieu de cp:

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

Testons-le:

$ 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'

Cependant, rsync fonctionnera correctement:

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

Vous pouvez toujours utiliser le /tmp pour une transmission. (Sans 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

Ou faire une fonction:

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

Comme ça:

~$ 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
Mr.m