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?
Essayer:
cp -ra /backup/olduser/. /home/newuser
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.
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.
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.
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.
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 * ^.*
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/