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.

7voto

Wink Saville Points 77

rsync est bon, mais un autre choix :

cp -a src/ dst/

Depuis l'aide principale :

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

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

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

0 votes

Cette réponse est incorrecte par rapport à la question posée à l'origine (inclure les fichiers cachés) : à la fois cp -r ainsi que cp -a copier les fichiers cachés lorsque cp ... src dst ou cp ... src/ dst/ est utilisé. Il se peut que cela ait changé au fil du temps.

6voto

simhumileco Points 627

La méthode la plus simple est la suivante :

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, vous pouvez utiliser l'expression suivante cp qui est la possibilité de spécifier plusieurs sources pour un dossier cible :

cp -r /etc/skel/* /home/user

2 votes

Cela manquerait des fichiers comme ..anything o ...anything etc. - stackoverflow.com/a/31438355/2351568 contient la regex correcte pour ce problème. || mais de toute façon, en utilisant shopt -s dotglob est toujours la meilleure solution !

0 votes

@DJCrashdummy malheureusement, je ne comprends pas pourquoi vous avez écrit votre attention. Après tout, ma solution prend en compte les cas que vous écrivez. Salutations

2 votes

Désolé, mauvais texte ! - Le problème avec votre réponse est qu'elle considère également . y .. (ce qui équivaut au dossier courant et à son dossier contenant). || mais toujours le réponse dans le lien l'explique plus en détail et fournit une solution.

5voto

madalu Points 421

Vous pouvez utiliser rsync.

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

Vous pouvez même copier par ssh

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

Il y a plusieurs options 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

4voto

Gabriel Hautclocq Points 151

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/

Ceci 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

0 votes

Ou vous pouvez simplement utiliser cp -r /etc/skel /home/user pour renommer skel à user ...

0 votes

C'est exact, seulement si /home/user n'existe pas encore.

4voto

Linus Points 41

Je suis venu ici après avoir cherché sur Google une solution au même problème, puis je me suis rendu compte que c'est facile à faire avec find. L'avantage c'est que ça ne dépend pas du Shell, ou d'utilitaires spéciaux qui ne sont pas forcément installés.

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

J'ai essayé l'astuce avec le slash de fin, mais ça n'a pas marché pour moi.

0 votes

Cela vous permet également d'exclure certains fichiers/répertoires à l'aide de filtres d'exclusion (par ex. ! -name 'dontcopythis' ) qui pourrait être utile.

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