2009-10-27 19:46:06 +0000 2009-10-27 19:46:06 +0000
423
423

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

Comment faire cp -r copier absolument tous les fichiers et les répertoires dans un répertoire

Exigences :

  • Inclure les fichiers cachés et les répertoires cachés.
  • Être une seule commande avec un drapeau pour inclure ce qui précède.
  • Ne pas avoir besoin de se fier du tout à la filiation.

Mon hack laid, mais qui marche, 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 filiation ? Quel drapeau dois-je utiliser ?

Réponses (14)

492
492
492
2011-12-12 22:00:01 +0000

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>

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

281
281
281
2009-10-27 19:55:27 +0000

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).

95
95
95
2015-09-08 21:50:45 +0000

Le moyen correct de le faire est d'utiliser l'option -T (--no-target-directory), et de 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 vers /home/user (y compris les fichiers cachés), en créant le dossier /home/user s'il n'existe pas ; cependant 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 existe.

68
68
68
2013-02-06 01:14:47 +0000

bash elle-même a 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 est la norme de bash

NOTE:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set
29
29
29
2014-02-20 13:18:25 +0000

Utilisez rsync :

rsync -rtv source_folder/ destination_folder/

7
7
7
2014-08-28 17:46:19 +0000

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
5
5
5
2018-06-06 16:13:41 +0000

La manière la 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 voulez pas utiliser l'expression ci-dessus, alors vous pouvez utiliser la propriété cp, qui est la capacité de spécifier plusieurs sources pour un dossier cible :

cp -r /etc/skel/* /etc/skel/.* /home/user
4
4
4
2016-01-17 17:32:26 +0000

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/

Il y a plusieurs drapeaux que vous pouvez utiliser : -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

4
4
4
2013-05-16 08:38:46 +0000

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.

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

cp -R /etc/skel /home/ && mv /home/skel /home/user
3
3
3
2015-07-24 13:34:27 +0000

Je suis venu ici après avoir cherché sur Google une solution au même problème, puis je me suis rendu compte qu'il est facile de faire avec la recherche. L'avantage, c'est que cela ne dépend pas du shell, ni des utilitaires spéciaux qui ne sont pas forcément installés.

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

J'ai essayé le truc de la barre oblique, mais ça n'a pas marché pour moi.

2
2
2
2018-01-30 20:42:49 +0000

Ma solution à ce problème, lorsque je dois copier tous les fichiers (y compris les fichiers .) vers un répertoire cible en conservant les autorisations, est : (écraser si déjà existant)

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

yes est pour écraser automatiquement les fichiers de destination, r récursif, v verbeux, p conserver les permissions.

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

Répertoire de destination se termine par / car nous plaçons le contenu du répertoire source vers la destination dans son ensemble.

2
2
2
2015-05-12 20:00:58 +0000

Notez qu'il existe un truc en ligne de commande (qui fonctionne au moins dans sh, bash et ksh) : Il suffit d'ajouter une barre oblique au répertoire from. Cela permettra de verser le contenu du répertoire from dans le répertoire to (ironiquement, j'avais d'abord appris cette astuce 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
1
1
2019-02-13 10:18:49 +0000

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

cd /etc/skel
find | cpio -pdumv /home/user
-2
-2
-2
2016-12-14 21:57:06 +0000

Depuis au moins K3b 2.0.3, il y a une boîte à questions qui apparaît lorsque le répertoire est ajouté au projet, qui demande si vous voulez inclure des fichiers cachés … il y a aussi une question qui apparaît pour demander si vous voulez inclure des liens. C'est bien !