Die Antwort von @derobert ist großartig, obwohl ich einige andere Informationen teilen möchte, die ich gefunden habe.
gzip -l -v
gzip-komprimierte Dateien enthalten bereits einen Hash (allerdings nicht sicher, siehe diesen SO-Beitrag ):
$ echo something > foo
$ gzip foo
$ gzip -v -l foo.gz
method crc date time compressed uncompressed ratio uncompressed_name
defla 18b1f736 Feb 8 22:34 34 10 -20.0% foo
Man kann CRC und unkomprimierte Größe kombinieren, um einen schnellen Fingerabdruck zu erhalten:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Verwenden Sie zum Überprüfen, ob zwei Bytes gleich sind oder nicht cmp file1 file2
. Jetzt hat eine komprimierte Datei einen Header mit angehängten Daten und Fußzeilen (CRC plus Originalgröße). Die Beschreibung des gzip-Formats zeigt, dass der Header die Zeit enthält, zu der die Datei komprimiert wurde, und dass der Dateiname eine nicht terminierte Zeichenfolge ist, die nach dem 10-Byte-Header angehängt wird.
Unter der Annahme, dass der Dateiname konstant ist und derselbe Befehl ( gzip "$name"
) verwendet wird, kann überprüft werden, ob zwei Dateien unterschiedlich sind, indem cmp
die ersten Bytes einschließlich der Zeit verwendet und übersprungen werden:
cmp -i 8 file1 file2
Hinweis : Die Annahme, dass dieselben Komprimierungsoptionen wichtig sind, andernfalls meldet der Befehl die Datei immer als unterschiedlich. Dies liegt daran, dass die Komprimierungsoptionen im Header gespeichert sind und sich auf die komprimierten Daten auswirken können. cmp
betrachtet nur rohe Bytes und interpretiert es nicht als gzip.
Wenn Sie Dateinamen gleicher Länge haben, können Sie versuchen, die zu überspringenden Bytes nach dem Lesen des Dateinamens zu berechnen. Wenn die Dateinamen unterschiedlich groß sind, können Sie cmp
nach dem Überspringen von Bytes wie z cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Dies ist definitiv der beste Weg, es komprimiert zuerst Daten und beginnt, die Bytes mit zu vergleichen cmp
(wirklich, das ist, was im zcmp
( zdiff
) Shellscript gemacht wird).
Ein Hinweis, haben Sie keine Angst vor dem folgenden Hinweis auf der Handbuchseite:
Wenn beide Dateien vor dem Vergleich dekomprimiert werden müssen, wird die zweite in / tmp dekomprimiert. In allen anderen Fällen verwenden zdiff und zcmp nur eine Pipe.
Wenn Sie einen ausreichend neuen Bash haben, wird bei der Komprimierung keine temporäre Datei verwendet, sondern nur eine Pipe. Oder wie die zdiff
Quelle sagt:
# Reject Solaris 8's buggy /bin/bash 2.03.