Réutilisation de rsync - sortie sèche pour accélérer le transfert réel plus tard


23

Je fais habituellement rsync -navant de faire un réel rsync. La chose est, comment pourrais-je automatiser la deuxième exécution pour réutiliser exactement la liste générée avec --dry-run?

Je veux dire, si je lance rsync -nalors j'obtiens une simulation de ce rsyncqui ferait, mon idée serait de prendre cette sortie, de la traiter puis de rsyncne faire que --include-fromcette sortie, donc la liste complète ne doit être calculée qu'une seule fois.

Si cela n'a même aucun sens, faites-le moi savoir.

Soit dit en passant, j'ai tendance à utiliser rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Si vous avez également une suggestion sur les options que vous utiliseriez, faites-le moi savoir. J'essaie de dupliquer le contenu d'un disque dur externe (qui ne contient que des images, des vidéos et des documents) sur un autre disque dur externe.


Vous pouvez essayer de rediriger la sortie de la --dry-runcommande dans un fichier (par exemple, rsync --dry-run -avz SOURCE DEST > include.txt), en supprimant toutes les lignes qui ne sont pas des fichiers / chemins de include.txt et en cours d'exécution rsync --include-from include.txt.
ThatGuy

Cette dernière commande devrait être rsync --include-from include.txt --exclude=* SOURCE DEST. Voir stackoverflow.com/a/19296415/1765910 pour plus de détails.
ThatGuy

Oui, c'est l'idée, mais je ne sais pas vraiment comment faire cela (en plus j'aimerais l'approbation de quelqu'un qui sait réellement ce qu'il fait). J'utilise juste rsyncmais je ne sais rien des scripts shell / bash…
Manuel

Réponses:


19

Il est certainement possible d'utiliser la liste de fichiers générée lors d'un essai à sec comme fichier inclus. Dans l'idéal, cependant, les lignes supplémentaires en haut et en bas de la sortie d'essai à sec doivent être supprimées.

Exemple de sortie:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Pour supprimer ces lignes, dirigez la rsyncsortie vers headet vers tail. Ensuite, enregistrez la sortie traitée dans un fichier include:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Enfin, dites rsyncd'utiliser le fichier include généré (en ajoutant des options supplémentaires si vous le souhaitez):

rsync --include-from=include.txt --exclude=* source/ dest/


Le problème est qu'il ne gère pas les fichiers qui doivent être supprimés. Et cette méthode de tail/ est-elle headsuffisamment robuste pour garantir de n'avoir que la liste des fichiers?
Manuel

L'ajout --deleteentraîne également la suppression des fichiers supprimés des répertoires source des répertoires de destination, du moins sur l'ordinateur sur lequel je l'ai essayé. Vous pouvez laisser de côté la partie tail/ head. rsyncinterprète chaque ligne du fichier inclus comme un nom de fichier et ignore simplement les fichiers non existants, donc rien ne se passera si vous conservez les lignes supplémentaires (sauf si vous avez des fichiers nommés "envoi d'une liste de fichiers incrémentielle", etc., auquel cas, ces fichiers seront également copiés).
ThatGuy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.