La réponse de @derobert est excellente, bien que je veuille partager d'autres informations que j'ai trouvées.
gzip -l -v
Les fichiers compressés avec gzip contiennent déjà un hachage (mais pas sécurisé, voir ce message 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
On peut combiner le CRC et la taille non compressée pour obtenir une empreinte digitale rapide:
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
Pour vérifier si deux octets sont égaux ou non, utilisez cmp file1 file2
. Maintenant, un fichier compressé a un en-tête avec les données et le pied de page (CRC plus la taille d'origine) ajoutés. La description du format gzip montre que l'en-tête contient l'heure à laquelle le fichier a été compressé et que le nom du fichier est une chaîne terminée par zéro qui est ajoutée après l'en-tête de 10 octets.
Ainsi, en supposant que le nom de fichier est constant et que la même commande ( gzip "$name"
) est utilisée, on peut vérifier si deux fichiers sont différents en utilisant cmp
et en sautant les premiers octets, y compris l'heure:
cmp -i 8 file1 file2
Remarque : l'hypothèse selon laquelle les mêmes options de compression sont importantes, sinon la commande signalera toujours le fichier comme différent. Cela se produit car les options de compression sont stockées dans l'en-tête et peuvent affecter les données compressées. cmp
regarde juste les octets bruts et ne l'interprète pas comme gzip.
Si vous avez des noms de fichiers de la même longueur, vous pouvez essayer de calculer les octets à ignorer après avoir lu le nom du fichier. Lorsque les noms de fichiers sont de taille différente, vous pouvez exécuter cmp
après avoir ignoré les octets, comme cmp <(cut -b9- file1) <(cut -b10- file2)
.
zcmp
C'est certainement la meilleure façon de procéder, il compresse d'abord les données et commence à comparer les octets avec cmp
(vraiment, c'est ce qui est fait dans le shellscript zcmp
( zdiff
)).
Une note, n'ayez pas peur de la note suivante dans la page de manuel:
Lorsque les deux fichiers doivent être décompressés avant la comparaison, le second est décompressé dans / tmp. Dans tous les autres cas, zdiff et zcmp utilisent uniquement un canal.
Lorsque vous avez un Bash suffisamment nouveau, la compression n'utilisera pas de fichier temporaire, juste un tube. Ou, comme le dit la zdiff
source:
# Reject Solaris 8's buggy /bin/bash 2.03.