J'avais l'habitude rsync
de copier un grand nombre de fichiers, mais mon système d'exploitation (Ubuntu) a redémarré de manière inattendue.
Après le redémarrage, j’ai de rsync
nouveau exécuté , mais à la sortie du terminal, j’ai trouvé que rsync
ceux-ci étaient toujours copiés. Mais j'ai entendu dire qu'il rsync
est capable de trouver des différences entre la source et la destination, et donc de simplement copier les différences. Je me demande donc dans mon cas si rsync
peut reprendre ce qui restait la dernière fois?
sudo rsync -azvv /home/path/folder1/ /home/path/folder2
. (3) La source et la cible sont à la fois NTFS, la source d'achat est un disque dur externe et la cible est un disque dur interne. (3) Il est en cours d'exécution et n'a pas encore fini.--modify-window
option aide à résoudre ce problème ).Réponses:
Tout d’abord, en ce qui concerne la partie "CV" de votre question,
--partial
indique simplement à la partie destinataire de conserver les fichiers partiellement transférés si la partie envoyée disparaît comme si ceux-ci étaient complètement transférés.Lors du transfert de fichiers, ils sont temporairement enregistrés en tant que fichiers masqués dans leurs dossiers cibles (par exemple
.TheFileYouAreSending.lRWzDC
) ou dans un dossier spécifiquement choisi si vous définissez le--partial-dir
commutateur. Lorsqu'un transfert échoue et--partial
n'est pas défini, ce fichier caché restera dans le dossier cible sous ce nom cryptique, mais s'il--partial
est défini, le fichier sera renommé en nom de fichier cible réel (dans ce cas,TheFileYouAreSending
), même si le fichier n'est pas complet. Le fait est que vous pouvez terminer le transfert ultérieurement en exécutant à nouveau rsync avec--append
ou--append-verify
.Donc,
--partial
ne reprend pas lui-même un transfert échoué ou annulé. Pour le reprendre, vous devrez utiliser l'un des indicateurs susmentionnés lors de la prochaine exécution. Donc, si vous devez vous assurer que la cible ne contiendra jamais de fichiers qui semblent être corrects mais qui sont en réalité incomplets, vous ne devriez pas les utiliser--partial
. Inversement, si vous voulez vous assurer de ne jamais laisser de fichiers égarés perdus et cachés dans le répertoire cible, et si vous savez que vous pourrez terminer le transfert ultérieurement,--partial
vous pouvez vous aider.En ce qui concerne le
--append
commutateur mentionné ci-dessus, il s'agit du commutateur "resume", que vous pouvez utiliser, que vous l'utilisiez ou non--partial
. En fait, lorsque vous utilisez--append
, aucun fichier temporaire n'est créé. Les fichiers sont écrits directement dans leurs cibles. À cet égard,--append
donne le même résultat que--partial
sur un transfert ayant échoué, mais sans créer ces fichiers temporaires masqués.Donc, pour résumer, si vous déplacez des fichiers volumineux et que vous souhaitez avoir la possibilité de reprendre une opération rsync annulée ou ayant échoué à partir du point exact qui
rsync
s'est arrêté, vous devez utiliser la touche--append
ou pour--append-verify
activer la prochaine tentative.Comme @Alex le souligne ci-dessous, depuis la version 3.0.0 a
rsync
maintenant une nouvelle option--append-verify
, qui se comporte comme--append
auparavant. Vous voulez probablement toujours le comportement de--append-verify
, alors vérifiez votre version avecrsync --version
. Si vous êtes sur un Mac et ne pas utiliserrsync
dehomebrew
, vous (au moins jusqu'au El Capitan) une version plus ancienne et la nécessité d'utiliser--append
plutôt que--append-verify
. Pourquoi ils n'ont pas gardé ce comportement--append
et nommé le nouveau venu--append-no-verify
est un peu déroutant. De toute façon,--append
surrsync
avant la version 3 est le même que--append-verify
sur les versions plus récentes.--append-verify
n'est pas dangereux: il lira et comparera toujours les données aux deux extrémités et ne supposera pas qu'elles sont égales. Pour ce faire, elle utilise des sommes de contrôle, ce qui facilite les choses sur le réseau, mais nécessite la lecture de la quantité de données partagée aux deux extrémités du câble avant de pouvoir reprendre le transfert en ajoutant à la cible.Deuxièmement, vous avez dit "avoir entendu dire que rsync était capable de trouver des différences entre la source et la destination, et donc de simplement copier les différences".
C'est exact, et cela s'appelle le transfert delta, mais c'est une chose différente. Pour l'activer, vous ajoutez le
-c
, ou--checksum
basculez. Une fois ce commutateur utilisé, rsync examinera les fichiers existant aux deux extrémités du fil. Cela se fait par morceaux, compare les sommes de contrôle des deux côtés et, si elles diffèrent, ne transfère que les parties différentes du fichier. Mais, comme @Jonathan le souligne ci-dessous, la comparaison n'est effectuée que lorsque les fichiers ont la même taille aux deux extrémités - des tailles différentes obligeront rsync à télécharger l'intégralité du fichier, en remplaçant la cible par le même nom.Cela nécessite un peu de calcul aux deux extrémités, mais peut s'avérer extrêmement efficace pour réduire la charge du réseau si, par exemple, vous sauvegardez fréquemment des fichiers très volumineux, des fichiers de taille fixe contenant souvent des modifications mineures. Les exemples qui me viennent à l’esprit sont les fichiers d’image de disque dur virtuel utilisés dans des machines virtuelles ou des cibles iSCSI.
Il est à noter que si vous utilisez
--checksum
pour transférer un lot de fichiers complètement nouveaux sur le système cible, rsync calculera toujours leurs sommes de contrôle sur le système source avant de les transférer. Pourquoi je ne sais pas :)Donc, en bref:
Si vous utilisez souvent rsync juste « passer des choses de A à B » et que vous voulez la possibilité d'annuler cette opération et reprendre plus tard, ne pas utiliser
--checksum
, mais n'utiliser .--append-verify
Si vous utilisez souvent rsync pour sauvegarder des
--append-verify
fichiers , leur utilisation ne vous aidera probablement pas beaucoup, sauf si vous avez l'habitude d'envoyer de gros fichiers dont la taille ne cesse de croître, mais qui sont rarement modifiés une fois écrits. En prime, si vous sauvegardez sur un stockage prenant en charge les instantanés tels quebtrfs
ouzfs
, l'ajout du--inplace
commutateur vous aidera à réduire la taille des instantanés, car les fichiers modifiés ne sont pas recréés, mais les blocs modifiés sont écrits directement par-dessus les anciens. Ce commutateur est également utile si vous souhaitez éviter que rsync ne crée des copies de fichiers sur la cible lorsque des modifications mineures ont eu lieu.Lors de l'utilisation
--append-verify
, rsync se comportera comme il le fait toujours pour tous les fichiers de même taille. S'ils diffèrent par la modification ou d'autres horodatages, la cible sera remplacée par la source sans examiner ces fichiers plus à fond.--checksum
comparera le contenu (sommes de contrôle) de chaque paire de fichiers de nom et de taille identiques.MIS À JOUR 2015-09-01 Modifié pour refléter les remarques de @Alex (merci!)
MIS À JOUR 2017-07-14 Modifié pour refléter les remarques de @Jonathan (merci!)
la source
--partial
est suffisant.--partial-dir
- cela semble être la solution idéale pour cela. J'ai peut-être complètement manqué quelque chose;)--partial
: rsync copie le fichier dans le nom temporaire, la connexion est interrompue, le serveur distant rsync finit par déplacer le fichier vers le nom habituel et se ferme, puis sur Pour relancer avec--partial
et sans--append
, le nouveau fichier temporaire est initialisé avec une copie du fichier distant partiellement transféré, puis la copie continue à partir de l'endroit où la connexion est morte. (Ubuntu 14.04 / rsync 3.1)--checksum
? Selon le,man
cela a plus à voir avec le choix des fichiers à marquer pour le transfert qu'avec le transfert delta (qui, vraisemblablement, estrsync
le comportement par défaut).TL; DR:
Spécifiez simplement un répertoire partiel comme le recommande la page de manuel rsync:
Explication plus longue:
Il existe en fait une fonctionnalité intégrée permettant d'utiliser cette
--partial-dir
option, ce qui présente plusieurs avantages par rapport à--partial
et--append-verify
/--append
alternative.Extrait des pages de manuel de rsync:
Par défaut, rsync utilise un nom de fichier temporaire aléatoire, qui est supprimé en cas d'échec du transfert. Comme mentionné, utiliser
--partial
rsync vous permet de conserver le fichier incomplet comme s'il avait été transféré avec succès , de sorte qu'il soit possible de l'ajouter ultérieurement à l'aide des options--append-verify
/--append
. Cependant, il y a plusieurs raisons pour lesquelles cela n'est pas optimal.Vos fichiers de sauvegarde peuvent ne pas être complets et, sans vérification du fichier distant qui doit rester inchangé, il n’ya aucun moyen de le savoir.
Si vous essayez d'utiliser
--backup
et--backup-dir
, vous venez d'ajouter une nouvelle version de ce fichier qui n'a même jamais été copiée auparavant dans l'historique de vos versions.Cependant, si nous l'utilisons
--partial-dir
, rsync conservera le fichier partiel temporaire et reprendra le téléchargement à l'aide de ce fichier partiel lors de sa prochaine exécution, sans que nous ayons à résoudre les problèmes ci-dessus.la source
Vous voudrez peut-être ajouter l'
-P
option à votre commande.De la
man
page:Donc au lieu de:
Faire:
Bien sûr, si vous ne voulez pas que les mises à jour de progression, vous pouvez simplement utiliser
--partial
, à savoir:la source
rsync
. Il est important de souligner, cependant, que--partial
cela ne reprend pas en soi un transfert ayant échoué. Voir ma réponse pour plus de détails :)-P
c'est suffisant dans mon cas. Versions: le client a 3.1.0 et le serveur a 3.1.1. J'ai interrompu le transfert d'un seul fichier volumineux avec ctrl-c. Je suppose que je manque quelque chose.vv
? c'est à direv
utilisé 2 fois?-azvvP
?Je pense que vous appelez de force le
rsync
et que, par conséquent, toutes les données sont téléchargées lorsque vous vous en souvenez. utilisez l'--progress
option pour copier uniquement les fichiers qui ne sont pas copiés et l'--delete
option pour supprimer tous les fichiers déjà copiés et qui n'existent plus dans le dossier source ...Si vous utilisez ssh pour vous connecter à un autre système et copier les fichiers,
laissez-moi savoir s'il y a une erreur dans ma compréhension de ce concept ...
la source
--delete
supprimera les fichiers de la destination qui n'existent pas dans la source. Le moins grave est que--progress
cela ne modifie pas la façon dont les choses sont copiées; il vous donne simplement un rapport d’avancement sur chaque fichier lorsqu’il est copié. (J'ai corrigé l'erreur grave; l'ai remplacée par--remove-source-files
.)J'utilise ce script simple. N'hésitez pas à ajuster certains drapeaux et / ou à les paramétrer.
la source
Arriver en retard à ceci, mais j'avais la même question et j'ai trouvé une réponse différente.
Le
--partial
drapeau ("conserver les fichiers partiellement transférés"rsync -h
) est utile pour les fichiers volumineux, tout comme--append
("ajouter des données à des fichiers plus courts"), mais la question concerne un grand nombre de fichiers.Pour éviter les fichiers déjà copiés, utilisez
-u
(ou--update
: "ignore les fichiers les plus récents sur le récepteur").la source