圧縮ファイルが圧縮されるかどうかを確認するために、重複ファイルでtarアーカイブを作成するちょっとした実験を行ったところ、,敬の念ではありませんでした。詳細は次のとおりです(読書の喜びのためにインデントされた結果):
$ dd if=/dev/urandom bs=1M count=1 of=a
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.114354 s, 9.2 MB/s
$ cp a b
$ ln a c
$ ll
total 3072
-rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 a
-rw-r--r-- 1 guido guido 1048576 Sep 24 15:51 b
-rw-r--r-- 2 guido guido 1048576 Sep 24 15:51 c
$ tar -c * -f test.tar
$ ls -l test.tar
-rw-r--r-- 1 guido guido 2109440 Sep 24 15:51 test.tar
$ gzip test.tar
$ ls -l test.tar.gz
-rw-r--r-- 1 guido guido 2097921 Sep 24 15:51 test.tar.gz
$
まず、ランダムデータの1MiBファイルを作成しました(a)。次に、ファイルbにコピーし、cにリンクしました。tarballは〜3Mibではなく〜2MiBのみであったため、tarballを作成するとき、tarは明らかにハードリンクを認識していました。
aとbは重複しているため、gzipがtarballのサイズを〜1MiBに縮小し、tarball内で1MiBの連続データが繰り返されるはずであるが、これは発生しませんでした。
どうしてこれなの?そして、これらの場合にどのように効率的にtarballを圧縮できますか?