GNU/Linux >> Tutoriels Linux >  >> Linux

Diff/correctif binaire pour les fichiers volumineux sous Linux ?

Vous devriez probablement jeter un œil aux outils liés à rsync :rdiff et sauvegarde rdiff .Le rdiff La commande vous permet de produire un fichier correctif et de l'appliquer à un autre fichier.

Le rdiff-backup La commande utilise cette approche pour traiter des répertoires entiers, mais je suppose que vous travaillez avec des images de disque à fichier unique, donc rdiff sera celui à utiliser.


xdelta peut faire tout ce que vous voulez. Juste avertissement cependant, si vos images ne sont pas très similaire, vous pouvez vous retrouver avec un patch très volumineux, car xdelta utilise la moitié de la mémoire tampon définie pour rechercher les différences. Plus d'informations sont disponibles sur la page wiki TuningMemoryBudget. Augmenter la taille du tampon peut aider un peu.

bsdiff est une autre option, mais c'est très RAM gourmande et totalement inappropriée pour tout ce qui a la taille d'une image disque.

bsdiff est assez gourmand en mémoire. Il nécessite max(17*n,9*n+m)+O(1) octets de mémoire, où n est la taille de l'ancien fichier et m est la taille du nouveau fichier. bspatch nécessite n+m+O(1) octets.


Réponse canonique

En ce qui concerne rdiff le message, librsync 2.0.1 est une bonne lecture pour la clarification de la fonctionnalité de commande, donc j'ai référencé cela ci-dessous pour préserver le contenu de cette réponse si rien d'autre.

Il est important d'essayer de bien comprendre les trois étapes rdiff pour mettre à jour un fichier :signature , delta , et correctif comme mentionné sur la page de manuel rdiff. J'ai aussi trouvé un rdiff exemple de script de commande sur GitHub qui est utile que je vais référencer et citer.

Essentiellement...

  1. Avec un fichier "de départ" ou de base [file1 ] et vous créez un fichier de signature d'elle
    • Ceci est généralement beaucoup plus petit que le fichier de base/d'origine lui-même
  2. Avec le fichier de signature vous le comparez à un autre fichier [file2 ] similaire à votre fichier de base mais différent (par exemple, récemment mis à jour ) et créez un fichier delta contenant uniquement les différences entre les deux fichiers
  3. Utilisez le fichier "différences uniquement" ou fichier delta et comparez-le avec votre fichier de base [file1 ] pour générer un nouveau fichier contenant les modifications de l'autre fichier [file2 ] correspondant aux deux.

Commandes rapides (par rdiff-example.sh )

rdiff signature file1 signature-file            ## signature base file1
rdiff delta signature-file file2 delta-file     ## delta differences file2
rdiff patch file1 delta-file gen-file           ## compare delta to file1 to create matching file2

rdiff-example.sh

# $ rdiff --help
# Usage: rdiff [OPTIONS] signature [BASIS [SIGNATURE]]
#              [OPTIONS] delta SIGNATURE [NEWFILE [DELTA]]
#              [OPTIONS] patch BASIS [DELTA [NEWFILE]]

# Options:
#   -v, --verbose             Trace internal processing
#   -V, --version             Show program version
#   -?, --help                Show this help message
#   -s, --statistics          Show performance statistics
# Delta-encoding options:
#   -b, --block-size=BYTES    Signature block size
#   -S, --sum-size=BYTES      Set signature strength
#       --paranoia            Verify all rolling checksums
# IO options:
#   -I, --input-size=BYTES    Input buffer size
#   -O, --output-size=BYTES   Output buffer size

# create signature for old file
rdiff signature old-file signature-file
# create delta using signature file and new file
rdiff delta signature-file new-file delta-file
# generate new file using old file and delta
rdiff patch old-file delta-file gen-file
# test
diff -s gen-file new-file
# Files gen-file and new-file are identical

Présentation

rdiff est un programme pour calculer et appliquer des deltas de réseau. Un delta rdiff est un delta entre des fichiers binaires, décrivant comment un fichier de base (ou ancien) peut être automatiquement modifié pour produire un fichier résultat (ou nouveau).

Contrairement à la plupart des programmes diff, librsync n'a pas besoin d'accéder aux deux fichiers lorsque le diff est calculé. Le calcul d'un delta nécessite juste une courte "signature" de l'ancien fichier et le contenu complet du nouveau fichier. La signature contient des sommes de contrôle pour les blocs de l'ancien fichier. À l'aide de ces sommes de contrôle, rdiff trouve les blocs correspondants dans le nouveau fichier, puis calcule le delta.

Les deltas rdiff sont généralement moins compacts et plus lents à produire que xdeltas ou des différences de texte régulières. S'il est possible d'avoir à la fois l'ancien et le nouveau fichier lors du calcul du delta, xdelta produira généralement un fichier beaucoup plus petit. Si les fichiers comparés sont en texte brut, alors GNU diff est généralement un meilleur choix, car les différences peuvent être vues par des humains et appliquées comme des correspondances inexactes.

rdiff prend tout son sens lorsqu'il n'est pas pratique d'avoir les deux fichiers présents en même temps. Par exemple, les deux fichiers se trouvent sur des machines distinctes et vous souhaitez transférer uniquement les différences. Un autre exemple est lorsque l'un des fichiers a été déplacé vers un support d'archive ou de sauvegarde, ne laissant que sa signature.

Symboliquement

signature(basis-file) -> sig-file

delta(sig-file, new-file) -> delta-file

patch(basis-file, delta-file) -> recreated-file

Utiliser des modèles

Une application typique de l'algorithme rsync est de transférer un fichier A2 d'une machine A vers une machine B qui a un fichier similaire A1. Cela peut être fait comme suit :

  1. B génère la signature rdiff de A1. Appelez cela S1. B envoie la signature à A. (La signature est généralement beaucoup plus petite que le fichier qu'elle décrit.)
  2. A calcule le delta rdiff entre S1 et A2. Appelez ce delta D. A envoie le delta à B.
  3. B applique le delta pour recréer A2. Dans les cas où A1 et A2 contiennent des séries d'octets identiques, rdiff devrait donner un gain d'espace significatif.

sources


Linux
  1. Déplacer des fichiers sur Linux sans mv

  2. 7 exemples de commandes de patch pour appliquer des fichiers de patch Diff sous Linux

  3. Comment auditer les modifications apportées aux fichiers et les exécutions de fichiers sous Linux

  4. Le système de fichiers Linux se remplit, malgré l'absence de fichiers ou de répertoires volumineux

  5. Comment distinguer le binaire des fichiers texte sous Linux

Collaborer sur un fichier en utilisant Linux diff et patch

Copier des fichiers sous Linux

Trouver des fichiers volumineux sous Linux

Commande Cp sous Linux (Copier des fichiers)

Comment diviser de gros fichiers audio sous Linux

Commande ls sous Linux pour lister les fichiers