zip コマンドのメモ
Apr 12, 2021 05:19 · 333 words · 2 minute read
前提
zip コマンドを雰囲気で使っていてミスをしたので、正しい挙動を記録する。
$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
ワーキングディレクトリからの相対パスに影響される
rm -r /tmp/a
mkdir -p /tmp/a/b
touch /tmp/a/b/c.txt
cp /tmp/a/b/c.txt /tmp/a/c.txt
md5 /tmp/a/b/c.txt
md5 /tmp/a/c.txt
cd /tmp/a
zip /tmp/a/z1.zip b/c.txt
cd /tmp/a/b
zip /tmp/a/z2.zip c.txt
cd /tmp/a
zip /tmp/a/z3.zip c.txt
md5 /tmp/a/*.zip
unzip /tmp/a/z1.zip -d /tmp/a/u1
unzip /tmp/a/z2.zip -d /tmp/a/u2
unzip /tmp/a/z3.zip -d /tmp/a/u3
md5 /tmp/a/u1/b/c.txt
md5 /tmp/a/u2/c.txt
md5 /tmp/a/u3/c.txt
MD5 (/tmp/a/b/c.txt) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/tmp/a/c.txt) = d41d8cd98f00b204e9800998ecf8427e
...
MD5 (/tmp/a/z1.zip) = ee09d1dbec34da9608637bf23c5ce606
MD5 (/tmp/a/z2.zip) = fb4e3a30cc5d60d7218132e8b23abf59
MD5 (/tmp/a/z3.zip) = fb4e3a30cc5d60d7218132e8b23abf59
...
MD5 (/tmp/a/u1/b/c.txt) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/tmp/a/u2/c.txt) = d41d8cd98f00b204e9800998ecf8427e
MD5 (/tmp/a/u3/c.txt) = d41d8cd98f00b204e9800998ecf8427e
同じファイルを圧縮する場合でもワーキングディレクトリからの相対パスに影響される。
タイムスタンプに影響される
次の例では、1回目と2回目で c.txt のタイムスタンプが同じなので、zipファイルのチェックサムも同じ。
rm -r /tmp/a
mkdir -p /tmp/a/b
touch /tmp/a/b/c.txt
stat /tmp/a/b/c.txt
cd /tmp/a
zip /tmp/a/z1.zip b/c.txt
md5 /tmp/a/*.zip
rm -r /tmp/a
mkdir -p /tmp/a/b
touch /tmp/a/b/c.txt
stat /tmp/a/b/c.txt
cd /tmp/a
zip /tmp/a/z2.zip b/c.txt
md5 /tmp/a/*.zip
16777220 8644565246 -rw-r--r-- 1 hkanazawa wheel 0 0 "Apr 10 22:22:05 2021" "Apr 10 22:22:05 2021" "Apr 10 22:22:05 2021" "Apr 10 22:22:05 2021" 4096 0 0 /tmp/a/b/c.txt
adding: b/c.txt (stored 0%)
MD5 (/tmp/a/z1.zip) = 7382008eb3704995c60c712f601f5a01
16777220 8644565251 -rw-r--r-- 1 hkanazawa wheel 0 0 "Apr 10 22:22:05 2021" "Apr 10 22:22:05 2021" "Apr 10 22:22:05 2021" "Apr 10 22:22:05 2021" 4096 0 0 /tmp/a/b/c.txt
adding: b/c.txt (stored 0%)
MD5 (/tmp/a/z2.zip) = 7382008eb3704995c60c712f601f5a01
しかし次の例では、1回目と2回目で c.txt のタイムスタンプが異なるので、zipファイルのチェックサムも別のものとなる。
rm -r /tmp/a
mkdir -p /tmp/a/b
touch /tmp/a/b/c.txt
stat /tmp/a/b/c.txt
cd /tmp/a
zip /tmp/a/z1.zip b/c.txt
md5 /tmp/a/*.zip
sleep 1
rm -r /tmp/a
mkdir -p /tmp/a/b
touch /tmp/a/b/c.txt
stat /tmp/a/b/c.txt
cd /tmp/a
zip /tmp/a/z2.zip b/c.txt
md5 /tmp/a/*.zip
16777220 8644565310 -rw-r--r-- 1 hkanazawa wheel 0 0 "Apr 10 22:23:31 2021" "Apr 10 22:23:31 2021" "Apr 10 22:23:31 2021" "Apr 10 22:23:31 2021" 4096 0 0 /tmp/a/b/c.txt
adding: b/c.txt (stored 0%)
MD5 (/tmp/a/z1.zip) = c842409158a7764d39eeab6a4811a7ea
16777220 8644565319 -rw-r--r-- 1 hkanazawa wheel 0 0 "Apr 10 22:23:32 2021" "Apr 10 22:23:32 2021" "Apr 10 22:23:32 2021" "Apr 10 22:23:32 2021" 4096 0 0 /tmp/a/b/c.txt
adding: b/c.txt (stored 0%)
MD5 (/tmp/a/z2.zip) = 5200f2a5766ccbcbd7593d0f3979f155