@derobertの回答は素晴らしいですが、見つけた他の情報を共有したいと思います。
gzip -l -v
gzip圧縮されたファイルにはすでにハッシュが含まれています(ただし、安全ではありません。この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
CRCと非圧縮サイズを組み合わせて、迅速なフィンガープリントを取得できます。
gzip -v -l foo.gz | awk '{print $2, $7}'
cmp
2バイトが等しいかどうかを確認するには、を使用しますcmp file1 file2
。これで、gzip圧縮されたファイルには、データとフッター(CRCと元のサイズ)が追加されたヘッダーが追加されました。gzip形式の説明は、ヘッダーにファイルが圧縮された時刻が含まれていること、およびファイル名が10バイトのヘッダーの後に追加されるNUL終了ストリングであることを示しています。
したがって、ファイル名が一定で同じコマンド(gzip "$name"
)が使用されていると仮定するcmp
と、時間を含む最初のバイトを使用してスキップすることで、2つのファイルが異なるかどうかを確認できます。
cmp -i 8 file1 file2
注:同じ圧縮オプションが重要であるという前提です。そうでない場合、コマンドは常にファイルを異なるものとして報告します。これは、圧縮オプションがヘッダーに格納されており、圧縮データに影響を与える可能性があるために発生します。cmp
生のバイトだけを見て、それをgzipとして解釈しません。
同じ長さのファイル名がある場合、ファイル名を読み取った後にスキップされるバイトを計算することができます。ファイル名のサイズが異なる場合cmp
、などのバイトをスキップして実行できますcmp <(cut -b9- file1) <(cut -b10- file2)
。
zcmp
これは間違いなく最善の方法です。最初にデータを圧縮し、バイトとの比較を開始しますcmp
(実際、これはzcmp
(zdiff
)シェルスクリプトで行われます)。
1つの注意点として、マニュアルページにある次の注意点を恐れないでください。
比較する前に両方のファイルを解凍する必要がある場合、2番目のファイルは/ tmpに解凍されます。他のすべての場合では、zdiffとzcmpはパイプのみを使用します。
十分に新しいBashがある場合、圧縮では一時ファイルは使用されず、パイプのみが使用されます。または、zdiff
ソースが言うように:
# Reject Solaris 8's buggy /bin/bash 2.03.