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?
.
et..
travaille. Soin d'expliquer?cp -r ./a b
n'a pas. Une idée pourquoi?r
option n'est pas nécessaire. L'a
option impliquer
.-a
paramètre ne fait rien pour aider dans cette situation. La commandecp -r ./a/. b
copiera le contenu, et uniquement le contenu du répertoire,a
dans le répertoireb
. Le-a
drapeau préserve les liens, les horodatages, etc., ce qui n’est pas pertinent pour la question.Deux répertoires a et b.
Les deux ont des fichiers dans.
Vous vous trouvez dans un répertoire contenant a et b.
-r
= récursivement.la source
cp
de copier un répertoirea
eta/.somedotfile
est contenu para
. S'ilb
existe, cette commande créera une copie exacte dea
atb/a
.cp -R /some/dir/* /another/dir
Rappelez-vous que, par défaut,
cp
copie le premier répertoire dans le deuxième répertoire si le deuxième existe.Par exemple
cp -r a b
va copier le répertoirea
dansb
. S'ilb
n'existe pas, il sera créé avec le contenu dea
.Si vous souhaitez copier le contenu de
a
dansb
(par exemple, lors de la copie d'un système de fichiers complet dans un point de montage), utilisez:comme dans la réponse précédente.
Veuillez également noter que
-a
, utilisé dans certaines des autres réponses, est identique à-dr --preserve=all
et préservera les horodatages, le contexte et les attributs étendus.la source
/.
marche?a/.
représente le contenu du répertoire 'a' par opposition au répertoire lui-même, dans la plupart des cas, il est également synonyme d'utilisationcp -r
évite le comportement par défaut de cp (copie d'un INTO b).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 du shell, par exemple l'option dotglob dans bash, mais ce ne sera alors pas l'option portable et robuste que vous recherchez.
Si vous avez besoin de le faire plus d'une ou deux fois, je vous recommande de vous pencher sur rsync ou à l'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.
la source
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
... letar cf - .
répertoire source du fichier compressé, fichiers inclus, et le crache dans STDOUT, qui est acheminé vers le STDIN dutar xf -
.Cela va copier les fichiers normaux et cachés, en excluant le répertoire parent (
..
):Si vous n'excluez pas le répertoire parent, vous obtenez également tout le contenu de
..
votre répertoire de destination.la source
..
(par exemple,...
ou..super-hidden
).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.
la source
*
ne correspond pas.
ou..
, mais si vous utilisez.*
. Essayezecho .*
. Vous pouvez exclure.
et..
avec le motif suivant:.[^.]*
..[^.]*
exclut toujours les noms qui commencent par..
(par exemple,...
ou..super-hidden
).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 où:
la source