Odpowiedź @derobert jest świetna, choć chcę podzielić się innymi informacjami, które znalazłem.
gzip -l -v
Pliki skompresowane gzip zawierają już skrót (choć nie jest to bezpieczne, zobacz ten post SO ):
$ 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
Można połączyć CRC i nieskompresowany rozmiar, aby uzyskać szybki odcisk palca:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Aby sprawdzić, czy dwa bajty są równe, czy nie, użyj cmp file1 file2
. Teraz plik spakowany gzip ma nagłówek z dołączonymi danymi i stopką (CRC plus rozmiar oryginalny). Opis formatu gzip pokazuje, że nagłówek zawiera czas, kiedy plik został skompresowany i że nazwa pliku jest ciągiem nul zakończone, który jest dołączany po nagłówku 10 bajtów.
Zakładając, że nazwa pliku jest stała i gzip "$name"
używana jest ta sama komenda ( ), można sprawdzić, czy dwa pliki są różne, używając cmp
i pomijając pierwsze bajty, w tym czas:
cmp -i 8 file1 file2
Uwaga : założenie, że te same opcje kompresji są ważne, w przeciwnym razie polecenie zawsze zgłosi plik jako inny. Dzieje się tak, ponieważ opcje kompresji są przechowywane w nagłówku i mogą wpływać na skompresowane dane. cmp
po prostu patrzy na surowe bajty i nie interpretuje go jako gzip.
Jeśli masz nazwy plików o tej samej długości, możesz spróbować obliczyć bajty, które zostaną pominięte po odczytaniu nazwy pliku. Gdy nazwy plików mają inny rozmiar, możesz uruchomić cmp
po pominięciu bajtów, np cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Jest to zdecydowanie najlepsza droga, najpierw kompresuje dane i zaczyna porównywać bajty cmp
(tak naprawdę dzieje się to w skoroszycie zcmp
( zdiff
)).
Jedna uwaga, nie bój się następującej uwagi na stronie podręcznika:
Gdy oba pliki muszą zostać zdekompresowane przed porównaniem, drugi jest nieskompresowany do / tmp. We wszystkich innych przypadkach zdiff i zcmp używają tylko potoku.
Gdy masz wystarczająco nową wersję Bash, kompresja nie użyje pliku tymczasowego, tylko potok. Lub, jak podaje zdiff
źródło:
# Reject Solaris 8's buggy /bin/bash 2.03.