Làm cách nào để chỉ định mức độ nén khi sử dụng tar -zcvf?


142

Tôi gzip thư mục rất thường xuyên trong công việc. Những gì tôi thường làm là

tar -zcvf file.tar.gz /path/to/directory

Có cách nào để xác định mức nén ở đây không? Tôi muốn sử dụng nén tốt nhất có thể ngay cả khi phải mất nhiều thời gian hơn để nén.

Câu trả lời:


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

giả sử bạn đang sử dụng bash. Nói chung, đặt biến môi trường GZIP thành "-9" và chạy tar bình thường.

Ngoài ra - nếu bạn thực sự muốn nén tốt nhất, đừng sử dụng gzip. Sử dụng lzma hoặc 7z.

Và khi sử dụng gzip (đó là ý tưởng tốt vì nhiều lý do khác nhau) hãy xem xét sử dụng pigzchương trình chứ không phải gzip.


14
pigz là "gzip song song" sử dụng tất cả các lõi của bạn để nén gzip. Bạn có thể xem topvà xem nó bằng cách sử dụng bất cứ nơi nào giữa CPU 200% -400 $.
Felipe Alvarez

2
FYI, đối với định dạng .bz2, sử dụng: BZIP2 = -9 tar cvjf file.tar.bz2 / path / to / thư mục
Tomofumi

3
Các biến môi trường dường như bây giờ GZIP_OPT, việc sử dụng nên giống nhau.
Seer

3
Từ trang man trên Ubuntu 16.04 cho gzip: "Trên Vax / VMS, tên của biến môi trường là GZIP_OPT, để tránh xung đột với biểu tượng được đặt cho việc gọi chương trình." Đối với sh, csh và MSDOS, nó vẫn chỉ là GZIP
Ponyboy47

68

Thay vì sử dụng cờ gzip cho tar, hãy gzip các tệp theo cách thủ công sau quá trình tar, sau đó bạn có thể chỉ định mức nén cho chương trình gzip:

tar -cvf files.tar /path/to/file0 /path/to/file1 ; gzip -9 files.tar

Hoặc bạn có thể sử dụng:

tar cvf - /path/to/file0 /path/to/file1 | gzip -9 - > files.tar.gz

-9 trong dòng lệnh gzip báo cho gzip sử dụng mức nén tối đa có thể (mặc định là -6).

Chỉnh sửa: Đã sửa lỗi dòng lệnh ống dựa trên nhận xét @depesz.


4
Sử dụng đường ống nên được thực hiện với:tar cvf - /path/to/directory | gzip -9 - > file.tar.gz

1
Ví dụ đầu tiên nên kết thúc bằng file.tar, vì gzipthêm phần mở rộng ".gz".
bonsaiviking 4/213

4
tại sao bạn không bỏ qua f -? nếu không có tập tin thì đó là stdin / out
akostadinov

Ngoài các bình luận phổ biến. Từ phần "man tar" Environtment: TAPE Device hoặc tệp để sử dụng cho kho lưu trữ nếu --file không được chỉ định. Nếu biến môi trường này không được đặt, thay vào đó hãy sử dụng stdin hoặc stdout.
Mikl

2
và chúng ta có thể giảm "gzip -9 -" -> "gzip -9". Từ phần "man gzip" Mô tả: Nếu không có tệp nào được chỉ định hoặc nếu tên tệp là "-", thì đầu vào tiêu chuẩn được nén thành đầu ra tiêu chuẩn.
Mikl

53

Các phiên bản hiện đại của tar hỗ trợ định dạng lưu trữ xz (GNU tar, từ 1.22 năm 2009, Busybox kể từ 1.17.0 năm 2010).

Nó dựa trên lzma2 , giống như phiên bản 7-Zip của gz . Điều này cho phép nén tốt hơn nếu bạn ổn với yêu cầu cần hỗ trợ xz.

tar -Jcvf file.tar.xz /path/to/directory

Tôi mới phát hiện ra ở đây (về cơ bản là một bản sao của câu hỏi này, nhưng trong stackexchange Unix) cũng có một biến môi trường XZ_OPT = -9 để kiểm soát mức nén XZ tương tự như GZIP trong bài khác.

XZ_OPT=-9 tar -Jcvf file.tar.xz /path/to/directory

2
+1 xz tốt hơn nhiều so với cả bzip2 và gzip. Đây là một so sánh: tukaani.org/lzma/benchmark.html
User1

8
Sự đánh đổi là tốc độ. XZ chậm hơn đáng kể .
Chuông

32
tar cv /path/to/directory | gzip --best > file.tar.gz

Đây là giải pháp thứ hai của Matrix Mole, nhưng hơi ngắn lại:

Khi gọi tar, tùy chọn fnói rằng đầu ra là một tệp. Đặt nó thành -(stdout) làm cho tar ghi đầu ra của nó thành thiết bị xuất chuẩn, đó là hành vi mặc định không có cả hai f-.

Và như đã nêu trong gziptrang man, nếu không có tệp nào được chỉ định thì gzip sẽ nén từ đầu vào tiêu chuẩn. Không có nhu cầu -trong gzipcuộc gọi.

Tùy chọn --best(tương đương -9) đặt mức nén cao nhất.


1
Điều này làm việc rất đẹp. Ngoài ra nếu bạn chạy bằng root, quyền và chủ sở hữu cũng được giữ nguyên. Nếu không, bạn phải xác định. Ngoài ra nếu không rõ ràng "-9" là nén tốt nhất và "-1" là nén nhanh nhất. "-1" vẫn mất một khoảng thời gian ngắn nếu bạn có nhiều tệp ;-)
PJ Brunet

Điều này làm việc với xzpixzquá. Đó là một cách tuyệt vời để kiểm soát số lượng luồng được sử dụng để nén song song mà không phải tạo tệp .tar trung gian. Như vậytar -cv /path/to/dir | pixz -p4 > output.tpxz
joelostblom

10

Ngoài ra còn có tùy chọn để chỉ định chương trình nén bằng -I. Điều này có thể bao gồm tùy chọn mức nén.

tar -I 'gzip -9' -cvf file.tar.gz /path/to/directory

2
Các phiên bản cũ hơn của tar như được cung cấp trong CentOS 6 & 7 không hỗ trợ cung cấp các đối số trong đối số -I, họ sẽ cố gắng coi toàn bộ là một tên chương trình để thực thi và do đó thất bại. Ít nhất là với tar 1.29 trong Debian Stretch, điều này không hoạt động.
Cheetah

2

Và tất nhiên tar có nguồn gốc bsd macOS phải khác:

tar -czf file.tar.gz --options gzip:compression-level=9 /path/to/directory
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.