La risposta di @derobert è ottima, anche se voglio condividere alcune altre informazioni che ho trovato.
gzip -l -v
I file compressi con gzip contengono già un hash (non sicuro però, vedi questo 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
È possibile combinare CRC e dimensioni non compresse per ottenere un'impronta digitale veloce:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Per verificare se due byte sono uguali o meno, utilizzare cmp file1 file2
. Ora, un file gzipped ha qualche intestazione con i dati e il piè di pagina (CRC più dimensioni originali) aggiunti. La descrizione del formato gzip mostra che l'intestazione contiene l'ora in cui il file è stato compresso e che il nome del file è una stringa con terminazione nulla che viene aggiunta dopo l'intestazione a 10 byte.
Quindi, supponendo che il nome del file sia costante e gzip "$name"
venga utilizzato lo stesso comando ( ), si può verificare se due file sono diversi usando cmp
e saltando i primi byte incluso il tempo:
cmp -i 8 file1 file2
Nota : il presupposto che le stesse opzioni di compressione siano importanti, altrimenti il comando riporterà sempre il file come diverso. Ciò accade perché le opzioni di compressione sono memorizzate nell'intestazione e possono influire sui dati compressi. cmp
guarda solo byte grezzi e non lo interpreta come gzip.
Se hai nomi di file della stessa lunghezza, puoi provare a calcolare i byte da saltare dopo aver letto il nome del file. Quando i nomi dei file sono di dimensioni diverse, è possibile eseguire cmp
dopo aver saltato i byte, ad esempio cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
Questo è sicuramente il modo migliore per andare, comprime prima i dati e inizia a confrontare i byte con cmp
(davvero, questo è ciò che viene fatto nello shellscript zcmp
( zdiff
)).
Una nota, non aver paura della seguente nota nella pagina del manuale:
Quando entrambi i file devono essere decompressi prima del confronto, il secondo è decompresso in / tmp. In tutti gli altri casi, zdiff e zcmp usano solo una pipe.
Quando hai un Bash sufficientemente nuovo, la compressione non utilizzerà un file temporaneo, ma solo una pipe. Oppure, come zdiff
dice la fonte:
# Reject Solaris 8's buggy /bin/bash 2.03.