Acabei de fazer um pequeno experimento em que criei um arquivo tar com arquivos duplicados para ver se ele seria compactado, para minha admiração, não era! Detalhes a seguir (resultados recuados para o prazer de ler):
$ 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
$
Primeiro, criei um arquivo de 1MiB de dados aleatórios (a). Depois copiei para um arquivo be também vinculei-o a c. Ao criar o tarball, o tar aparentemente estava ciente do hardlink, já que o tarball tinha apenas ~ 2MiB e não ~ 3Mib.
Agora eu esperava que o gzip reduzisse o tamanho do tarball para ~ 1MiB, já que aeb são duplicados, e deveria haver 1MiB de dados contínuos repetidos dentro do tarball, mas isso não ocorreu.
Por que é isso? E como eu poderia comprimir o tarball com eficiência nesses casos?