web-dev-qa-db-fra.com

Copier le contenu du répertoire à l'aide de la commande 'cp'

Comment copier tout le contenu d'un répertoire dans un autre?

Par exemple:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

Le problème avec ce qui précède est que le modèle globant '*' correspond aux répertoires cachés '.' et '..' et vous vous retrouvez avec un répertoire 'olduser' à l'intérieur de 'newuser', ainsi que son contenu.

Vous pouvez aussi faire quelque chose comme ça:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

Mais que se passe-t-il si newuser contient déjà des fichiers et des répertoires par défaut?

Quel est le moyen le plus simple, le plus correct, le plus facile à retenir et sans faille pour déplacer le contenu d'un répertoire vers un autre à l'aide de la commande de base 'cp' et du shell?

33
nomount

Essayer:

cp -ra /backup/olduser/. /home/newuser
30
nagul

Deux répertoires a et b.

Les deux ont des fichiers dans.

Vous vous trouvez dans un répertoire contenant a et b.

cp -r ./a b

-r = récursivement.

23
Rich Bradshaw

Rappelez-vous également que, par défaut, cp copie le premier répertoire DANS le second répertoire si le second existe. Par exemple, cp -a a b copiera a INTO b si b existe, c’est-à-dire qu’il créera a dans b.

Si ce n'est pas ce que vous voulez et que vous voulez copier le contenu de a dans b (par exemple, lors de la copie d'un système de fichiers complet dans un point de montage), utilisez :

cp -a a/. b

comme dans la réponse précédente.

Veuillez également noter que -a inclut -r, donc -ar est redondant.

18
Nicolas Bonnefon

Sauf si vous avez sérieusement reconfiguré votre shell, le motif globbing '*' ne correspond pas à '.' ou '..', comme vous pouvez le vérifier en utilisant simplement echo *. Au lieu de cela, il omet les fichiers dont le nom commence par un ".", Votre approche omettra donc tous les fichiers cachés. Vous pouvez modifier une partie de ce comportement avec les options de Shell, par exemple, l’option dotglob dans bash, mais ce ne sera alors pas l’option portable et robuste que vous recherchez.

Si vous devez le faire plusieurs fois, nous vous recommandons d’examiner rsync ou unisson (en fonction des besoins spécifiques) avec des spécifications source et cible soigneusement élaborées.

Une autre alternative consiste à placer le répertoire source dans une archive et à le décompresser sur le répertoire cible existant.

6
Peter Eisentraut

Cela va copier les fichiers normaux et cachés, en excluant le répertoire parent (..):

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

Si vous n'excluez pas le répertoire parent, vous obtenez également tout le contenu de .. dans votre répertoire de destination.

2
mch

Cela fonctionne pour la copie de tous les fichiers et répertoires à l'exception des répertoires cachés de manière récursive du répertoire en cours vers n'importe quel emplacement:

cp -rf * ^.* 
0
Seeeve

Pour copier des fichiers commençant par un point, faites simplement cp. * Target /

Le plus simple est donc de faire la commande cp deux fois.

Comme le dit Peter Eisentraut, les règles de globbing normales n'incluent pas .. et. (hm, comment finir cette phrase?;)

Utilisez simplement -r pour le rendre récursif et -i pour que cp vous demande si vous voulez vraiment écraser un fichier.

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/
0
gaqzi