web-dev-qa-db-fra.com

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

Comment faire pour que cp -r copie absolument tout des fichiers et des répertoires d'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 hack, mais qui travaille, c'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?

356
eleven81

Ne spécifiez pas les fichiers:

cp -r /etc/skel /home/user

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

244
Randy Orrison

Disons que vous avez créé le nouveau dossier (ou allez en créer un) et que vous souhaitez y copier les fichiers une fois le dossier créé.

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 existant déjà créé sur la première ligne.

445
Bruno Pereira

bash a lui-même une bonne solution, elle a un Shell option, vous pouvez cp, mv et ainsi de suite:

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 correspond à la norme bash

REMARQUE:

shopt # without argument show status of all Shell options
-u # abbrivation of unset 
-s # abbrivation of set
65
PersianGulf

Pour ce faire, utilisez l’option -T (--no-target-directory) et copiez récursivement les dossiers (sans les barres obliques, astérisques, etc.), c’est-à-dire

cp -rT /etc/skel /home/user

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

65
TechnocratiK

Utilisez rsync:

rsync -rtv source_folder/ destination_folder/

24
user1084282

Si votre répertoire source et votre répertoire cible ont 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.

Vous pouvez éventuellement copier le répertoire et le renommer en une seule ligne:

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

rsync c'est bien, 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
4
Wink Saville

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 indicateurs: -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

3
RoshP

Le moyen le plus simple est:

cp -r /etc/skel/{.,}* /home/user

L'expression {.,}* inclut tous les fichiers et répertoires (commençant également par un point).

Si vous ne souhaitez pas utiliser l'expression ci-dessus, vous pouvez utiliser la propriété cp, qui permet de spécifier plusieurs sources pour un dossier cible:

cp -r /etc/skel/* /etc/skel/.* /home/user
3
simhumileco

Notez qu’il existe une astuce en ligne de commande (fonctionne au moins dans sh , bash et ksh ): il suffit de suffixer le répertoire de avec une barre oblique. Cela versera le contenu du répertoire from dans le répertoire vers (ironiquement, j'avais d'abord appris cette astuce lorsque using 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
2
Dustin Oprea

Je suis venu ici avec Google pour trouver une solution au même problème, puis j’ai réalisé que c’était facile à trouver. L'avantage est qu'il ne dépend pas du shell ou des utilitaires spéciaux qui peuvent ne pas être installés.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

J'ai essayé le truc avec slash de fuite, mais cela n'a pas fonctionné pour moi.

2
Linus

Ma solution à ce problème lorsque je dois copier tous les fichiers (y compris les fichiers .) dans un répertoire cible en conservant les autorisations est: (écrasez-la si elle existe déjà)

yes | cp -rvp /source/directory /destination/directory/

yes sert à écraser automatiquement les fichiers de destination. r récursif, v verbeux, p conserver les autorisations.

Notez que le chemin source ne se termine pas par un /(donc tous les fichiers/répertoire et .fichiers sont copiés)

Le répertoire de destination se termine par /car nous plaçons le contenu du dossier source dans le répertoire de destination.

2
Rajneesh Gadge

J'ai vu que cp ne copie pas toujours les fichiers cachés et si vous souhaitez une commande qui semble fonctionner avec tous les dialectes linux/unix, vous devriez essayer d'utiliser:

cd /etc/skel
find | cpio -pdumv /home/user
1
Mikael Nyborg