So konvertieren Sie vorhandene gz (gzip) -Dateien nach rsyncable

12

Ich verwende rsync, um ein Repository zu sichern, das täglich viele gz-Dateien enthält, einschließlich vieler neuer. Die rsync-Sicherung verläuft langsamer als erwartet, da diese gz-Dateien nicht mit der Option --rsyncable von gzip erstellt werden (wodurch gz-Dateien wesentlich „rsync-freundlicher“ werden, ohne dass ihre Größe oder Kompatibilität wesentlich zunimmt). Und ich kann das Problem zum Zeitpunkt der Erstellung nicht beheben, da die Dateien von einem Python-Skript (rdiff-backup) generiert werden, das das gzip-Modul von Python verwendet und kein Äquivalent zu gzips --rsyncable unterstützt.

Vor dem Ausführen von rsync kann ich also alle neuen gz-Dateien in den Quelldaten identifizieren (dh neu seit dem letzten Ausführen von rsync). Jetzt möchte ich diese Dateien erneut gzipen, damit sie im rsyncable-Format gzippt werden. Dann kann ich rsync von der optimierten Quelle ausführen.

Ich denke, dies bedeutet, dass jede Datei mit gunzip und dann mit gzip --rsyncable ausgeführt wird, aber ich bin nicht sicher, wie dies auf eine Weise erfolgen soll, bei der kein Risiko besteht, Daten oder Metadaten zu verlieren. Vorschläge dankbar erhalten.

Gogoud
quelle
8
Die einzige Möglichkeit --rsyncableist, ob die Dateien zwischen den Durchläufen geändert werden und rsyncversuchen, die Änderungen zu senden. Neue Dateien interessieren sich nicht dafür, ob sie rsyncbar sind oder nicht, da sie rsyncohnehin alle Daten senden müssen. Werden die Dateien zwischen Rsync-Läufen geändert?
Tom Hunt
Guter Punkt. Eigentlich bin ich mir nicht sicher, ich werde das überprüfen. Nehmen wir vorerst an, dass sich der Inhalt einiger gz-Dateien ändert.
Gogoud
Das Beste, was ich mir vorstellen kann, ist, ein Skript auszuführen, das nach neuen Dateien sucht, diese dekomprimiert und sie dann erneut mit komprimiert --rsyncable.
Tom Hunt
Ich bin damit einverstanden, dass dies kein Problem sein sollte, wenn sich die Dateien nicht ändern. Stellen Sie insbesondere aus Gründen der Geschwindigkeit sicher, dass Sie die Prüfsummen basierend auf der Zeit überspringen, indem Sie die Zeiten mit dem -aFlag beibehalten. Außerdem hat meine Version von gzip kein --rsyncableFlag, aber es kommt mit einem Programm namens znew, das wahrscheinlich für das verwendet werden könnte, was Sie brauchen.
user3188445
2
Es stellt sich heraus, dass sich die von rdiff-backup erstellten gz-Dateien, wie Tom dachte, nicht ändern, sobald sie erstellt wurden. Daher --rsyncablewürde die Verwendung nicht helfen. Ich hatte auf eine Codezeile oder ein kurzes Skript gehofft, das ein gz-Archiv sicher entpacken und es mit neu packen würde --rsyncable. Aber jetzt ist es nur eine akademische Frage für mich.
Gogoud

Antworten:

1
#! /bin/bash

set -euo pipefail

##  TOKEN's creation time marks the time since last recompression
TOKEN=.lastRecompression   

if [ -f ${TOKEN} ]
then
    find -name '*.gz' -cnewer "${TOKEN}"
else
    # Process all compressed files if there is no token.
    find -name '*.gz'
fi | while read f
do
    # Do it in two steps
    gunzip < "$f" | gzip --rsyncable > "$f.tmp"

    # Preserve attributes
    cp "$f" "$f.tmp" --attributes-only

    # and rename atomically.
    # set -e ensures that a problem in the previous step 
    # will stop the full script. 
    mv -v "$f.tmp" "$f"
done

# Update the token
touch ${TOKEN}
Raúl Salinas-Monteagudo
quelle
1
Auf diese Weise gunzip | gzipverlieren Sie den unkomprimierten Namen und die Uhrzeit, die in der GZ-Datei gespeichert sind (und mit dieser gesehen wurden gzip -vNl)
Stéphane Chazelas
@ Stéphane Chazelas: Sie haben Recht: Wenn diese Informationen relevant sind (sie waren für mich noch nie relevant), verlieren wir sie. Vielleicht ist die beste Lösung, wenn Gunzip diese Neukomprimierung direkt unterstützt. Alle Metadaten können intern übergeben werden.
Raúl Salinas-Monteagudo
@ StéphaneChazelas Weißt du, dass es verlustfrei geht?
Tom Hale