Làm cách nào để có được nén tối đa với .tar.gz? [bản sao]


63

Câu hỏi này đã có câu trả lời ở đây:

Cách tôi hiểu việc sử dụng tar + gzip tarthường được sử dụng để hợp nhất một nhóm các tệp thành một tệp duy nhất, sau đó gzipđược sử dụng để nén tệp đó.

Gần đây tôi đã học được rằng tarcũng có thể nén.

Bởi vì tôi không hiểu đầy đủ về cách hoạt động của nén @ nó là cốt lõi, tôi có (có thể nực cười) rằng việc gửi .tar được nén trước tới gzip có thể ngăn gzip nén cũng như tiềm năng của nó sẽ cho phép và những thứ thuộc về bản chất đó.

Câu hỏi của tôi về cơ bản là: Tôi nên sử dụng kết hợp các phương thức nén / args nào để tạo tar.gz nhỏ nhất tuyệt đối và câu lệnh dòng lệnh trông như thế nào cho điều đó?


2
Nén các tệp đã nén có thể làm giảm kích thước của chúng hoặc có thể làm cho kho lưu trữ lớn hơn. Tất cả phụ thuộc vào loại dữ liệu và bất kỳ nén được sử dụng.
Keltari

Những gì @Keltari nói. Tốc độ và tỷ lệ nén phụ thuộc rất nhiều vào những gì bạn đang nén, đó cũng là lý do tại sao có các thuật toán và phương pháp nén khác nhau.
music2myear

Câu trả lời:


111

Hoặc, bạn có thể nói tar cho người dùng nén tối đa theo cách này:

export GZIP=-9
tar cvzf file.tar.gz /path/to/directory

Ngoài ra, để giữ cho envvars của bạn không lộn xộn, bạn có thể làm điều này:

env GZIP=-9 tar cvzf file.tar.gz /path/to/directory

43

Như bạn đã nói - " tar cũng có thể nén ", ngụ ý rằng - tarkhông phải lúc nào nó cũng tự nén dữ liệu.

Nó chỉ làm như vậy khi được sử dụng với ztùy chọn. Điều đó cũng không phải bởi chính nó, mà - bằng cách chuyển dữ liệu tarred qua gzip.

Tuy nhiên, thay vào đó, như đã lưu ý trong câu trả lời này , bạn có thể đặt hai lệnh: tar& gzipsao cho bạn có thể chỉ định rõ ràng mức nén cho gziplệnh để đạt được kích thước đầu ra nhỏ nhất.

tar cvf - / path / đến / thư mục | gzip -9 -> file.tar.gz

Ở đây 9chỉ định mức nén tối đa có thể.


Tôi đã có một vấn đề trong đó nó không đệ quy và phàn nàn rằng nó sẽ là một kho lưu trữ trống, vì lệnh bị chia tách, thật khó để tìm cách buộc đệ quy đúng cách, vì nó đã được mặc định. BAD MY, tôi đã chỉ định không chính xác nó bắt đầu như thế nàytar -cvf /path
Brian Thomas

17

Thông thường, cả gzip và tar đều không thể tạo ra "tar.gz nhỏ nhất tuyệt đối". Có nhiều tiện ích nén có thể nén theo định dạng gz. Tôi đã viết một kịch bản bash " gz99 " thử gzip, 7zadvdefđể có được những tập tin nhỏ nhất. Để sử dụng điều này để tạo tập tin nhỏ nhất có thể chạy:

tar c path/to/data | gz99 file.gz

Các advdeftiện ích từ AdvanceCOMP thường cung cấp cho các tập tin nhỏ nhất, nhưng cũng là lỗi (các gz99kiểm tra tiện ích mà nó đã không bị hỏng các tập tin trước khi chấp nhận kết quả của advdef). Để sử dụng advdeftrực tiếp, hãy tạo file.tar.gz theo cách bạn muốn. Sau đó chạy:

advdef -z -4 file.tar.gz

Điều này sẽ tạo ra một tệp gz tiêu chuẩn có thể được đọc bằng gzip và tar như bình thường, chỉ nhỏ hơn một chút. Đây là về điều tốt nhất bạn có thể làm với định dạng gz.

Vì gần đây bạn mới biết rằng tar có thể nén và không nói lý do tại sao bạn muốn tệp ".tar.gz" nhỏ nhất, bạn có thể không biết rằng có thể sử dụng các định dạng hiệu quả hơn với các tệp tar, chẳng hạn như xz. Nói chung, việc chuyển sang một định dạng khác có thể giúp cải thiện khả năng nén tốt hơn nhiều so với vòng xoay với các tùy chọn gzip. Nhược điểm chính của xz là nó không phổ biến như gzip nên những người bạn gửi tệp có thể phải cài đặt gói mới. Nó cũng có xu hướng chậm hơn một chút, đặc biệt là khi nén. Nếu điều này không quan trọng với bạn và bạn thực sự muốn tập tin tar nhỏ nhất, hãy thử:

 tar cv path/to/data | xz -9 > file.tar.xz

Các phiên bản hiện đại của tar, ví dụ trên Ubuntu 13.10, tự động phát hiện các tệp nén. Vì vậy, ngay cả khi bạn sử dụng nén xz, bạn vẫn có thể giải nén như bình thường:

 tar xvf file.tar.xz

Để đưa ra ý tưởng nhanh về cách các tiện ích nén này so sánh, hãy xem xét hiệu quả của việc nén patch-3.1.1 từ kernel linux:

utility         cpu    format  size(bytes)
gzip -9         0.02s  gz      105,628
advdef -2       0.07s  gz      102,619
7z -mx=9 -tgzip 0.42s  gz      102,297
advdef -3       0.55s  gz      102,290
advdef -4       0.75s  gz      101,956
xz -9           0.03s  xz       91,064
xz -3e          0.15s  xz       90,996

Trong ví dụ tầm thường này, chúng ta thấy rằng để có được gz nhỏ nhất, chúng ta cần advdef (mặc dù 7z -tgzip gần như tốt và ít lỗi hơn rất nhiều). Chúng tôi cũng thấy rằng việc chuyển sang xz giúp chúng tôi có nhiều không gian hơn so với việc cố gắng tận dụng tối đa định dạng gz cũ, mà không cần nén quá lâu.


OP đã hỏi làm thế nào để có được độ nén nhiều nhất cho tệp .tar.gz, nhưng bạn đã đề xuất tạo tệp .tar.xz. Bạn đang trả lời một câu hỏi khác với hỏi.
ChrisInEdicine

Ah, tôi thấy những gì bạn đang đi. advdef chỉ gặp sự cố trên hệ thống của tôi (v1.15), vì vậy 'advdef -z -4 file.tar.gz' không hoạt động, nhưng ít nhất về mặt lý thuyết là có thể. Tôi không thể tìm thấy bằng chứng rằng nó sẽ thu nhỏ tệp hơn 'gzip -9', nhưng có thể, và trong mọi trường hợp là đủ để tôi xóa bỏ -1 phiếu bầu của mình. Cảm ơn đã làm rõ!
ChrisInEdmont

Hmm, tôi đang sử dụng v1.17. Dù sao, nhà toán học nhi khoa trong tôi muốn chỉ ra rằng câu trả lời của tôi được cho là không đúng về mặt kỹ thuật. Rốt cuộc, nếu bạn liệt kê tất cả các tệp gz có thể từ ngắn nhất đến dài nhất và chọn tệp đầu tiên giải nén sang đúng tệp, bạn có thể tắt thêm một vài byte. Nhưng đó là cách quá chậm trong thực tế.
gmatht

Tôi không nghĩ "lỗi" và "lưu trữ" nên được sử dụng cùng nhau, sử dụng lưu trữ nào bị hỏng? Bạn cần một tệp lớn hơn nhiều để "so sánh" các tiện ích nén và các loại tệp đầu vào khác nhau - đo bằng một phần trăm của sự khác biệt thứ hai không đáng tin cậy, tôi nghĩ xz -9thường mất gz -9khoảng thời gian gấp 5 lần, không chỉ 1,5 lần như bảng của bạn cho thấy.
Xen2050

làm thế nào chúng ta có thể tạo lưu trữ phân chia (trong khi nén) bằng cách sử dụng quy trình xz
nyxee

6
tar c /path/to/data | gzip --best > file.tar.gz

gziptùy chọn --best(tương đương -9) yêu cầu mức nén cao nhất.


4
Ngoài ra, sử dụng --bestcờ: -9 gây nhầm lẫn cho người đọc.
om-nom-nom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.