gzipコマンドとタイムスタンプ

今日は「gzip」についての小ネタです。


manを見ていたところ、gzipコマンドはデフォルトで、
 圧縮時→元ファイルの名前とタイムスタンプを保存する
 伸張時→元ファイルの名前とタイムスタンプを復元しない
という動作をするとのこと。


少し試してみました。


以下のようなテキストを作成します。
で、コピーします。

$ vi test.txt 
aaa
bbb
ccc
ddd
eee
fff


作ったデータは「diff」及び「md5sum」, 「sha1sum」でも同一な事が確認できます。
タイムスタンプはctimeだけ違います。

$ cp -p test.txt test2.txt

$ diff test.txt test2.txt

$ md5sum test.txt test2.txt
8c84cc5459eeabb62b0d317179fb7cc5  test.txt
8c84cc5459eeabb62b0d317179fb7cc5  test2.txt

$ sha1sum test.txt test2.txt
d0d8c1b500d7bf74f252fbd495f18b1e5790c794  test.txt
d0d8c1b500d7bf74f252fbd495f18b1e5790c794  test2.txt

$ ls -u --full-time test.txt test2.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:48:10.000000000 +0900 test.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:48:10.000000000 +0900 test2.txt

$ ls -t --full-time test.txt test2.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:47:43.000000000 +0900 test.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:47:43.000000000 +0900 test2.txt

$ ls -c --full-time test.txt test2.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:47:43.000000000 +0900 test.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:48:10.000000000 +0900 test2.txt


普通に何もオプションを付けず、先ほどのファイルをgzipで圧縮すると、
ファイル名とタイムスタンプが保存されているため、ハッシュ値が変わりました。


タイムスタンプは一緒。


「hexdump」の結果も若干違う模様。

$ gzip test.txt test2.txt

$ md5sum test.txt.gz test2.txt.gz
a3be8769c6b68242f6f2359248435299  test.txt.gz
7ea97e525e154a8da0b4ae1bb6560bfc  test2.txt.gz

$ sha1sum test.txt.gz test2.txt.gz
d7b6ebd2c7f1b52ac2c2b53c546a75497cabb96a  test.txt.gz
f3bdec7642d512e81fece0fd752f188f1c22a9f6  test2.txt.gz

$ ls -u --full-time test.txt.gz test2.txt.gz
-rw-rw-r-- 1 myuser myuser 53 2011-01-06 23:50:34.000000000 +0900 test.txt.gz
-rw-rw-r-- 1 myuser myuser 54 2011-01-06 23:50:34.000000000 +0900 test2.txt.gz

$ ls -t --full-time test.txt.gz test2.txt.gz
-rw-rw-r-- 1 myuser myuser 53 2011-01-06 23:47:43.000000000 +0900 test.txt.gz
-rw-rw-r-- 1 myuser myuser 54 2011-01-06 23:47:43.000000000 +0900 test2.txt.gz

$ ls -c --full-time test.txt.gz test2.txt.gz
-rw-rw-r-- 1 myuser myuser 53 2011-01-06 23:50:34.000000000 +0900 test.txt.gz
-rw-rw-r-- 1 myuser myuser 54 2011-01-06 23:50:34.000000000 +0900 test2.txt.gz

$ hexdump -C test.txt.gz 
00000000  1f 8b 08 08 0f d6 25 4d  00 03 74 65 73 74 2e 74  |......%M..test.t|
00000010  78 74 00 4b 4c 4c e4 4a  4a 4a e2 4a 4e 4e e6 4a  |xt.KLL.JJJ.JNN.J|
00000020  49 49 e1 4a 4d 4d e5 4a  4b 4b e3 02 00 68 d8 87  |II.JMM.JKK...h..|
00000030  05 18 00 00 00                                    |.....|
00000035

$ hexdump -C test2.txt.gz 
00000000  1f 8b 08 08 0f d6 25 4d  00 03 74 65 73 74 32 2e  |......%M..test2.|
00000010  74 78 74 00 4b 4c 4c e4  4a 4a 4a e2 4a 4e 4e e6  |txt.KLL.JJJ.JNN.|
00000020  4a 49 49 e1 4a 4d 4d e5  4a 4b 4b e3 02 00 68 d8  |JII.JMM.JKK...h.|
00000030  87 05 18 00 00 00                                 |......|
00000036


次に「-n」オプション付けて圧縮してみます。
もう一度最初から。

$ cp -p test.txt test2.txt

$ diff test.txt test2.txt

$ md5sum test.txt test2.txt
8c84cc5459eeabb62b0d317179fb7cc5  test.txt
8c84cc5459eeabb62b0d317179fb7cc5  test2.txt

$ sha1sum test.txt test2.txt
d0d8c1b500d7bf74f252fbd495f18b1e5790c794  test.txt
d0d8c1b500d7bf74f252fbd495f18b1e5790c794  test2.txt

$ ls -u --full-time test.txt test2.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:54:33.000000000 +0900 test.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:54:33.000000000 +0900 test2.txt

$ ls -t --full-time test.txt test2.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:47:43.000000000 +0900 test.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:47:43.000000000 +0900 test2.txt

$ ls -c --full-time test.txt test2.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:54:25.000000000 +0900 test.txt
-rw-rw-r-- 1 myuser myuser 24 2011-01-06 23:54:33.000000000 +0900 test2.txt


gzipをする際、「-n」オプションを付けて圧縮します。
ファイル名とタイムスタンプが保存されなくなるので、ハッシュ値が同じになりました。
こちらは「hexdump」の結果も一緒。

$ gzip -n test.txt test2.txt

$ md5sum test.txt.gz test2.txt.gz
3c947d16c8aa3248bd58e77e2558a4cd  test.txt.gz
3c947d16c8aa3248bd58e77e2558a4cd  test2.txt.gz

$ sha1sum test.txt.gz test2.txt.gz
65d10d3a559d31daf5a269d530ee00a6a14c7d6b  test.txt.gz
65d10d3a559d31daf5a269d530ee00a6a14c7d6b  test2.txt.gz

$ ls -u --full-time test.txt.gz test2.txt.gz
-rw-rw-r-- 1 myuser myuser 44 2011-01-06 23:58:51.000000000 +0900 test.txt.gz
-rw-rw-r-- 1 myuser myuser 44 2011-01-06 23:58:51.000000000 +0900 test2.txt.gz

$ ls -t --full-time test.txt.gz test2.txt.gz
-rw-rw-r-- 1 myuser myuser 44 2011-01-06 23:47:43.000000000 +0900 test.txt.gz
-rw-rw-r-- 1 myuser myuser 44 2011-01-06 23:47:43.000000000 +0900 test2.txt.gz

$ ls -c --full-time test.txt.gz test2.txt.gz
-rw-rw-r-- 1 myuser myuser 44 2011-01-06 23:58:51.000000000 +0900 test.txt.gz
-rw-rw-r-- 1 myuser myuser 44 2011-01-06 23:58:51.000000000 +0900 test2.txt.gz

$ hexdump -C test.txt.gz
00000000  1f 8b 08 00 00 00 00 00  00 03 4b 4c 4c e4 4a 4a  |..........KLL.JJ|
00000010  4a e2 4a 4e 4e e6 4a 49  49 e1 4a 4d 4d e5 4a 4b  |J.JNN.JII.JMM.JK|
00000020  4b e3 02 00 68 d8 87 05  18 00 00 00              |K...h.......|
0000002c

$ hexdump -C test2.txt.gz
00000000  1f 8b 08 00 00 00 00 00  00 03 4b 4c 4c e4 4a 4a  |..........KLL.JJ|
00000010  4a e2 4a 4e 4e e6 4a 49  49 e1 4a 4d 4d e5 4a 4b  |J.JNN.JII.JMM.JK|
00000020  4b e3 02 00 68 d8 87 05  18 00 00 00              |K...h.......|
0000002c


ハッシュ使ってデータチェックする場合は注意しようと思いました。


今日はこんな所で。