Ich habe gerade ein kleines Experiment gemacht, in dem ich ein Tar-Archiv mit doppelten Dateien erstellt habe, um zu sehen, ob es komprimiert werden würde. Zu meiner Ehrfurcht war es nicht! Details folgen (Ergebnisse für Lesevergnügen eingerückt):
$ 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
$
Zuerst habe ich eine 1MiB-Datei mit zufälligen Daten erstellt (a). Dann habe ich es in eine Datei b kopiert und es auch mit c verknüpft. Bei der Erstellung des Tarballs war tar anscheinend der Hardlink bekannt, da der Tarball nur ~ 2 MB und nicht ~ 3 MB groß war.
Nun erwartete ich, dass gzip die Größe des Tarballs auf ~ 1MiB reduziert, da a und b Duplikate sind, und es sollte 1MiB fortlaufende Daten geben, die im Tarball wiederholt werden, dies trat jedoch nicht auf.
Warum ist das? Und wie könnte ich das Archiv in diesen Fällen effizient komprimieren?