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


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

Exigences:

  • Inclure les fichiers cachés et les répertoires cachés.
  • Soyez une seule commande avec un drapeau pour inclure ce qui précède.
  • Pas besoin de compter sur la correspondance de modèle du tout.

Mon laid, mais travaillant, hack est:

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

Comment puis-je faire tout cela en une seule commande sans correspondance de modèle? Quel drapeau dois-je utiliser?


294
2017-10-27 19:46


origine


Plus de réponses ici, même si elles ne semblent pas aussi bonnes. serverfault.com/questions/3154/... - Roel Van de Paar
S'il vous plaît, Eleven81, envisagez de changer la réponse acceptée à celle donnée par @bruno pereira, car cela évite de créer un nouveau dossier. Sinon, laissez ce commentaire avertir les nouveaux lecteurs de vérifier l’autre réponse (la plus votée). Tx. - Dr Beco


Réponses:


Ne spécifiez pas les fichiers:

cp -r /etc/skel /home/user

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


214
2017-10-27 19:55



Est-il possible d'utiliser quelque chose de semblable si /home/user/skel  Est-ce que exister? - bradley.ayers
@ bradley.ayers Je pense que l'on pourrait copier dans un sous-répertoire temporaire, puis les déplacer au niveau supérieur (étant donné que le déplacement dans le même lecteur est rapide). Moins qu'idéal, mais plus court que d'autres solutions pour moi. - Halil Özgür
@ bradley.ayers La réponse de Bruno ci-dessous répond à votre question - Mark
Cette solution n'a pas fonctionné pour moi. Il n'a pas copié les fichiers cachés. J'utilise CentOS version 6.5. La solution de Bruno a fait l'affaire. - Technext
Sous Ubuntu / Debian, cela place le répertoire 'skel' dans le répertoire cible et non les fichiers récursifs dans skel. Utilisation -T (pas de cible) par dessous pour une utilisation correcte. (-rT pour récursif) - bshea


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

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

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


378
2017-12-12 22:00



Si je ne me suis pas trompé, cela ne copiait pas les fichiers cachés / à points. - Halil Özgür
Fonctionne bien pour moi. Notez que le '.' est essentiel à son fonctionnement. - Mark
Ça marche, mais pourquoi? Impossible de trouver une référence à cela dans le manuel. - Julien Palard
Je pense que cela fonctionne parce que normalement, cela créerait un nouveau dossier avec le nom du dernier dossier dans le premier argument. Cependant, depuis ce nom est ., ce comportement nécessiterait la création d'un répertoire déjà existant, de sorte qu'il ignore simplement cette étape. - Zenexer
@Technext Le regroupement par défaut dans bash n'inclut pas les noms de fichiers commençant par un ., pour changer cela vous devez utiliser le shopt -s dotglob commande avant pour pouvoir inclure ces fichiers. Donc avec *, par défaut, vous demandez de copier tous les fichiers récursivement à partir de ce répertoire qui peut être développé en utilisant * (qui n'inclut pas les fichiers cachés par défaut). Alors que de l'autre côté avec . vous utilisez cp pour copier récursivement tout depuis "ce répertoire". - Bruno Pereira


bash elle-même a une bonne solution, elle a shell option, Vous pouvez cp, mv etc.:

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

et

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

La solution ci-dessus est la norme de bash

REMARQUE:

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

59
2018-02-06 01:14



C'est utile lorsque vous voulez copier uniquement du contenu sans créer de nouveau répertoire à l'intérieur de la destination. Surtout quand le répertoire de destination est le point de montage. - kaszynek
C'est vraiment la meilleure réponse et va au coeur de la question. - Stephen
Ses setopt pour zsh, au cas où quelqu'un d'autre se demanderait. - Pat


Le moyen correct de le faire est d'utiliser le -T (--no-target-directory) option, et recursivement copier les dossiers (sans les barres obliques, astérisques, etc.), à savoir:

cp -rT /etc/skel /home/user

Cela copiera le contenu de /etc/skel à /home/user (y compris les fichiers cachés), création du dossier /home/user s'il n'existe pas; Cependant, le -T option empêche le contenu de /etc/skel d'être copié dans un nouveau dossier /home/user/skel devrait le dossier /home/user exister.


45
2017-09-08 21:50



Bonne réponse. +1 - bshea
c'était en effet exactement la bonne réponse - Gaetan


Utilisez rsync:

rsync -rtv source_folder/ destination_folder/


23
2018-02-20 13:18





Si votre répertoire source et cible porte le même nom, même si le répertoire cible existe, vous pouvez simplement taper:

cp -R /etc/skel /home/

Cela copiera le répertoire / etc / skel dans / home /, y compris les fichiers et répertoires cachés.

Finalement, vous pouvez copier le répertoire et le renommer en une seule ligne:

cp -R /etc/skel /home/ && mv /home/skel /home/user

3
2018-05-16 08:38



Ou vous pourriez simplement utiliser cp -r /etc/skel /home/user pour renommer skel à user... - David
C'est vrai, seulement si / home / user n'existe pas encore. - Gabriel Hautclocq


rsync est bon, mais un autre choix:

cp -a src/ dst/

De l'aide principale:

   -a, --archive
          same as -dR --preserve=all

   -d     same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively

2
2017-08-28 17:46



J'ai toujours utilisé cp -r. Merci d'avoir mentionné cp -a - Pinaki Mukherjee


Vous pouvez utiliser rsync.

rsync -aP ./from/dir/ /some/other/directory/

Vous pouvez même copier sur ssh

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

Vous pouvez utiliser différents drapeaux:     -a, --archive # archive (-rlptgoD)

-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # --devices --specials

--delete         # Delete extra files

You may want to add the -P option to your command.

--partial        # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P               # The -P option is equivalent to --partial --progress.   Its  purpose  is to make it much easier to specify these two options for a long transfer that may be interrupted.

Page de manuel Rsync


2
2018-01-17 17:32





Notez qu’il existe une astuce en ligne de commande (au moins, sh, frapper, et ksh): Suffixe simplement le de répertoire avec une barre oblique Cela va verser le contenu de la de répertoire dans le à répertoire (ironiquement, j'avais d'abord appris à propos de cette astuce quand en utilisant  rsync).

Exemple:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa

1
2018-05-12 20:00