609 votes

Comment copier avec cp pour inclure les fichiers et répertoires cachés et leur contenu ?

Comment puis-je faire cp -r copie absolument tout des fichiers et répertoires d'un répertoire

Exigences :

  • Inclure les fichiers cachés et les répertoires cachés.
  • Soyez une commande unique avec un drapeau pour inclure ce qui précède.
  • Il n'est pas du tout nécessaire de s'appuyer sur la correspondance des modèles.

Mon hack moche, mais qui fonctionne, est :

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

Comment puis-je faire tout cela en une seule commande sans la correspondance des motifs ? Quel drapeau dois-je utiliser ?

1 votes

Plus de réponses ici, bien qu'elles n'aient pas l'air aussi bonnes ; serverfault.com/questions/3154/

2 votes

S'il vous plaît, Eleven81, envisagez de changer la réponse acceptée pour celle donnée par @bruno pereira, car elle évite de créer un nouveau dossier. Sinon, que ce commentaire soit un avertissement aux nouveaux lecteurs de vérifier également l'autre réponse (la plus votée). Tx.

0 votes

Et si vous couriez shopt -u dotglob pour inclure les fichiers cachés, puis exécutez cp -rfv /etc/skel /home/user qui vous montrera également la progression dans le cas où vous copiez un grand répertoire.

688voto

Bruno Pereira Points 8070

Disons que vous avez créé le nouveau dossier (ou que vous allez en créer un) et que vous voulez y copier les fichiers après la création du dossier.

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

Ceci copiera tous les fichiers/dossiers récursivement de /etc/skel dans le dossier déjà existant créé sur la première ligne.

6 votes

Si je ne me suis pas trompé, ça n'a pas copié les fichiers cachés.

74 votes

Ça marche bien pour moi. Notez que le "." est essentiel pour que cela fonctionne.

17 votes

Cela fonctionne, mais pourquoi ? Je ne trouve pas de référence à cela dans le manuel.

387voto

Randy Orrison Points 6801

Ne spécifiez pas les fichiers :

cp -r /etc/skel /home/user

(Notez que /home/user ne doit pas déjà exister, sinon il créera /home/user/skel .)

89 votes

Est-il possible d'utiliser quelque chose de similaire si /home/user/skel fait existent ?

0 votes

@bradley.ayers Je pense que l'on pourrait copier dans un sous-répertoire temporaire puis les déplacer vers le niveau supérieur (puisque le déplacement dans le même lecteur est rapide). Moins qu'idéal, mais plus court que les autres solutions à mon avis.

8 votes

@bradley.ayers La réponse de Bruno ci-dessous répond à votre question.

237voto

TechnocratiK Points 2171

Le moyen correct de le faire est d'utiliser la fonction -T (--no-target-directory) et copier récursivement les dossiers (sans barres obliques, astérisques, etc.), c'est-à-dire :

cp -rT /etc/skel /home/user

Cela copiera le contenu de /etc/skel a /home/user (y compris les fichiers cachés), en créant le dossier /home/user s'il n'existe pas ; toutefois, le -T empêche le contenu du fichier /etc/skel d'être copié dans un nouveau dossier /home/user/skel le dossier /home/user existent.

17 votes

Réponse correcte. +1

0 votes

C'était en effet exactement la bonne réponse

5 votes

Il s'agit de la MEILLEURE réponse du groupe ; c'est la seule qui résout le problème sans le compliquer.

77voto

PersianGulf Points 913

bash lui-même a une bonne solution, il a une shell option Vous pouvez cp , mv et ainsi de suite.. :

shopt -s dotglob # for considering dot files (turn on dot files)

y

shopt -u dotglob # for don't considering dot files (turn off dot files)

La solution ci-dessus est standard de bash

NOTE :

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

2 votes

C'est utile lorsque vous voulez copier seulement le contenu sans créer de nouveau répertoire dans la destination. Surtout lorsque le répertoire de destination est un point de montage.

9 votes

C'est setopt pour zsh, au cas où quelqu'un d'autre se poserait la question.

36voto

user1084282 Points 451

Utilisez rsync :

rsync -rtv source_folder/ destination_folder/

0 votes

La meilleure option pour moi, bien que j'utilise --progress pour avoir plus de retour sur l'ensemble du processus.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X