GNU/Linux >> Linux の 問題 >  >> Linux

gzip を実行すると、内容は同じだが md5sums が異なるファイル?

RFC 1952 によると、gzip ファイル ヘッダーには 変更時刻 が含まれます 元のファイルの (フィールド MTIME )。 gzip -lv renew.log.gz でヘッダーをプレーンテキストで表示できます :

method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 64263ac7 Jun 21 17:59                 314                 597  52.1% renew.log

したがって、本当に gzip されたファイルを比較したい場合は、-n で圧縮してください。 元のファイル名とタイム スタンプを保存しないオプション 、

gzip -n renew.log s3/renew.log 

そしてそれらの md5sum は同一でなければなりません。

それ以外の場合は、使用できます

md5sum <(zcat renew.log.gz) <(zcat s3/renew.log.gz)

解凍されたファイルの md5sum を計算します。

ただし、表示される時刻と日付はヘッダーから取得されたものではなく、現在の値を表しています。これはファイル名にも当てはまります:

$ gzip renew.log 
$ mv renew.log.gz foo.gz
$ gzip -lv foo.gz -------- uncompressed name is taken from current name ---v
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 6c721644 Jul 11 22:34                 580                1586  65.7% foo
$ hexdump -C foo.gz | head -n 2
00000000  1f 8b 08 08 f0 16 df 51  00 03 72 65 6e 65 77 2e  |.......Q..renew.|
00000010  6c 6f 67 00 8d 93 dd 6e  9b 30 18 86 8f 89 94 7b  |log....n.0.....{|
                                                             ^^^-------^^^^^
                                                  original filename is stored in the header

同じファイルの圧縮バージョンが同じであると期待するのはなぜですか?圧縮プログラム (gzip) は、ヘッダーにタイムスタンプを含めたり、ランダム化されたアルゴリズムを使用したりできます。

そしてまさに! gzip ヘッダーにはタイムスタンプが含まれています。圧縮ファイルを同じにしたい場合は、ファイルのタイムスタンプが同じでなければなりません!

したがって、ファイルをコピーするときは、常に cp -p file1 file1 として実行してください 、 cp file1 file2 だけではありません - それは実際には悪い習慣です!


「-n」フラグを付けて gzip を使用するだけです:

[email protected]:~$ gzip -n Yippie-Ki-Yay.mp3 bla/Yippie-Ki-Yay.mp3 

[email protected]:~$ sha1sum Yippie-Ki-Yay.mp3.gz bla/Yippie-Ki-Yay.mp3.gz 
b44b21c5f414935f1ced1187bfafd989704474a5  Yippie-Ki-Yay.mp3.gz
b44b21c5f414935f1ced1187bfafd989704474a5  bla/Yippie-Ki-Yay.mp3.gz

ソース:https://unix.stackexchange.com/questions/31008/why-does-the-gzip-version-of-files-produce-a-different-md5-checksum


Linux
  1. ディレクトリ付きの猫ファイル?

  2. Linux – Linuxのオブジェクトファイルのフォーマットは異なりますか?

  3. ソース ファイルが異なるディレクトリにある Makefile

  1. アルファベット順に並べ替えたときに N 個のファイルを除くすべてを削除する Bash スクリプト

  2. スクリプトの同じ行で stderr と stdout を別のファイルにリダイレクトする方法は?

  3. 特定のファイルを除く tar/gzip

  1. bash:/bin/tar:tar で多数のファイルを圧縮すると、引数リストが長すぎます

  2. Linux Bash:複数の異なるファイルを同じディレクトリに移動する

  3. タイムゾーンが異なるファイルで find -mtime が期待どおりに機能しないのはなぜですか?