Tôi vừa thực hiện một thử nghiệm nhỏ trong đó tôi đã tạo một kho lưu trữ tar với các tệp trùng lặp để xem liệu nó có bị nén hay không, với sự kinh ngạc của tôi, thì không! Chi tiết theo dõi (kết quả thụt lề để đọc niềm vui):
$ 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
$
Đầu tiên tôi tạo một tệp 1MiB của dữ liệu ngẫu nhiên (a). Sau đó, tôi đã sao chép nó vào một tập tin b và cũng liên kết nó với c. Khi tạo tarball, tar rõ ràng nhận thức được liên kết cứng, vì tarball chỉ ~ 2MiB chứ không phải ~ 3Mib.
Bây giờ tôi dự kiến gzip sẽ giảm kích thước của tarball xuống ~ 1MiB vì a và b là trùng lặp và sẽ có 1MiB dữ liệu liên tục được lặp lại bên trong tarball, nhưng điều này đã không xảy ra.
Tại sao lại thế này? Và làm thế nào tôi có thể nén tarball hiệu quả trong những trường hợp này?