Copie récursive / profonde du répertoire en ligne de commande sous Linux?

13

Quelle est une bonne façon générale de faire une copie de répertoire récursif / profond sous Linux qui fonctionne dans la plupart des cas? J'ai utilisé des choses simples comme cp -Rdes cpioincantations assez élaborées . Y a-t-il des forces ou des faiblesses importantes qui vous poussent à préférer l'une à l'autre? Lequel utilisez-vous le plus souvent?

Greg Mattes
la source

Réponses:

29
NAME
cp - copy files and directories

-a, --archive
   same as -dpR

-d     same as --no-dereference --preserve=links
-p     same as --preserve=mode,ownership,timestamps
-R, -r, --recursive
    copy directories recursively

Donc en réponse à votre question:

cp -a /foo /bar

Copiez tout de manière récursive du répertoire / foo vers le répertoire / bar tout en préservant les liens symboliques et le "mode" "propriété" & "horodatages" du fichier / répertoire.

Gareth
la source
Il s'agit certainement d'une solution très simple et élégante. Avez-vous déjà trouvé des inconvénients à cette approche? Systèmes de fichiers distribués? Copies extrêmement grandes? Avez-vous trouvé d'autres solutions comme cpio, tar ou rsync pour être plus efficaces dans certains cas?
Greg Mattes,
1
À moins qu'il n'y ait une erreur physique, je n'ai jamais eu d'échec de «cp» local de la mémoire (je n'ai fait que des transferts de taille TB) vers n'importe quel endroit monté localement (indépendamment du montage NFS ou Samba). Consultez 'USAGE' sous la page de manuel rsync pour des exemples que vous trouverez instructifs. Mon préféré: $ rsync --partial --progress --rsh = ssh --archive --verbose --compress foo / user @ hosname: ~ / bar (rsync -avzP)
Gareth
Comme je l'ai noté ci-dessus, -a n'est pas strictement portable.
Matthew Flaschen
Eh bien, je sais que busybox, GNU et BSD cp sont ok. À part les anciennes boîtes Unix, je n'ai jamais vu sur quoi cela ne fonctionnerait-il pas? Je ne vois pas vraiment le point autrement, bien que je comprenne complètement le sentiment de Zoredache de "Cela semble toujours faire le travail correctement, donc je n'ai jamais vraiment cherché à trouver un remplaçant."
Gareth
@gyaresu Veuillez envisager de diviser votre deuxième commentaire en une autre réponse afin que nous puissions voter dessus.
Greg Mattes
6

J'utilise une commande comme "cd $ srcdir; tar -c. | Tar -C $ destdir -x" le plus souvent. Mais j'utilise également rsync -a $ src $ dst.

La plus grande force de la solution tar est que c'est ce que j'ai dû utiliser il y a plusieurs années sur un système qui n'avait pas cpio, rsync ou un cp qui copierait récursivement. Le goudron est à peu près partout. Il est collé sur ma tête car je l'ai beaucoup utilisé, il y a probablement des façons plus élégantes. Il semble toujours faire le travail correctement, donc je n'ai jamais vraiment cherché à trouver un remplaçant.

Zoredache
la source
J'aime beaucoup l'argument "l'ubiquité du goudron". Je suis compétent en vi pour des raisons similaires même si je préfère d'autres environnements d'édition.
Greg Mattes
-R fait depuis longtemps partie de la norme ( opengroup.org/onlinepubs/009695399/utilities/cp.html ) mais pas -a.
Matthew Flaschen
@Matthew Flaschen: Votre commentaire est-il destiné à la réponse de @ gyaresu?
Greg Mattes,
Il est également pertinent pour celui-ci, car Zoredache a déclaré qu'il a rencontré un système qui "n'avait pas [...] un cp qui copierait récursivement". Fondamentalement, -R -> portable, -a -> non portable.
Matthew Flaschen
1
C'était en ~ 95 et le système exécutait une version fin des années 80 d'Unix. Je ne pense pas que -R était une option pour cp, mais je ne suis pas certain. J'ai appris cette friandise en lisant l'usenet.
Zoredache
6

Jetez un œil à rsync ... Je l'aime parce que vous copiez moins de données lorsque vous gardez deux répertoires à jour ... cela peut également fonctionner à distance. Dans sa forme la plus simple, rsync -a / src / dest

trent
la source
C'est un très bon point. Essentiellement, rsync a la capacité de calculer un «répertoire diff» et de transférer uniquement ce qui est nécessaire pour synchroniser les répertoires. Ainsi, vous pouvez appeler à plusieurs reprises quelque chose comme rsync -a src / dest pour "copier continuellement" les répertoires de manière récursive (la fin / sur src est nécessaire pour une bonne synchronisation) tandis que cp -a src / dest ne fonctionne pas comme ça. La commande cp créera un nouveau répertoire src dans dest après le premier cp. Vous auriez besoin de quelque chose comme cp -au src / * dest pour les copies suivantes.
Greg Mattes,
L'autre raison pour laquelle j'aime rsync est que vous pouvez lui passer l'indicateur -P, qui affiche une barre de progression. Cela vous donne une idée du temps que prendra quelque chose
Rory
0

rsyncest un excellent outil. C'est le couteau suisse de transfert de données. C'est un outil tellement simple et puissant. Une fois que vous commencez à l'utiliser, vous devenez accro.

Rory
la source