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
ハッシュ使ってデータチェックする場合は注意しようと思いました。
今日はこんな所で。