Ho appena fatto un piccolo esperimento in cui ho creato un archivio tar con file duplicati per vedere se sarebbe stato compresso, con mio stupore, non lo era! Seguono i dettagli (risultati rientrati per piacere di lettura):
$ 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
$
Innanzitutto ho creato un file 1MiB di dati casuali (a). Quindi l'ho copiato in un file b e l'ho anche collegato a c. Durante la creazione del tarball, tar apparentemente era a conoscenza del collegamento fisico, poiché il tarball era solo ~ 2MiB e non ~ 3Mib.
Ora mi aspettavo che gzip riduca la dimensione del tarball a ~ 1MiB poiché aeb sono duplicati e ci dovrebbero essere 1MiB di dati continui ripetuti all'interno del tarball, ma ciò non è avvenuto.
Perchè è questo? E come potrei comprimere il tarball in modo efficiente in questi casi?