Làm thế nào để XZ một thư mục với TAR bằng cách sử dụng nén tối đa?


116

Vì vậy, tôi cần phải nén một thư mục với nén tối đa.

Làm thế nào tôi có thể làm điều đó với xz? Ý tôi là tôi cũng sẽ cần tarvì tôi không thể nén một thư mục xz. Có một oneliner để sản xuất ví dụ foo.tar.xz?


11
FWIW, man 1 xznói it's not a good idea to blindly use -9 for everything like it often is with gzip(1) and bzip2(1). -7 ... -9 [...] These are useful only when compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, respectively.RTFM để biết thêm.
cychoi 10/2/2015

Câu trả lời:


82

Giả sử xztôn vinh bộ cờ lệnh tiêu chuẩn - bao gồm các cờ mức nén, bạn có thể thử:

tar -cf - foo/ | xz -9 -c - > foo.tar.xz 

và điều này sử dụng mức nén tối đa với XZ?
LanceBaynes

3
thêm -9 vào xz sẽ làm cho nó tối đa
bsd

23
-9elà cấp độ tốt nhất, nhưng sẽ mất rất nhiều thời gian
Krzysztof Krasnoyń

-9esẽ không luôn luôn cung cấp cho bạn kết quả tốt nhất - xem điểm 8 tại đây rootusers.com/13-simple-xz-examples
KolonUK

1
Ngoài ra, bạn có thể thấy sự cải thiện đáng kể nếu bạn thêm --threads=0vào xz
KolonUK

146

Với một GNU gần đây tartrên bash hoặc shell có nguồn gốc:

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

Công tắc j chữ thường của tar sử dụng bzip, công tắc J viết hoa sử dụng xz.

Biến XZ_OPTmôi trường cho phép bạn đặt xzcác tùy chọn không thể truyền qua các ứng dụng gọi điện như tar.

Điều này bây giờ là tối đa .

Xem man xzcác tùy chọn khác mà bạn có thể đặt ( -e/ --extreme có thể cung cấp cho bạn một số lợi ích nén bổ sung cho một số bộ dữ liệu).

XZ_OPT=-e9 tar cJf tarfile.tar.xz directory

27
Không, bạn không. Đó là toàn bộ vấn đề. Bạn có thể đặt var môi trường cho lời gọi đó. Bạn có thể xuất nó nếu bạn muốn, nhưng bạn không phải.
bsd

2
Bạn đang giả sử vỏ như bash cho điều đó.
anddam

7
@anddam, được hỗ trợ bởi tất cả các vỏ của gia đình Bourne (Bourne, ksh, mksh, pdksh, tro, dash, bash, yash, zsh) rcakanga. fish, csh, tcsheslà vỏ lớn mà không hỗ trợ nó. Ở đó, bạn sẽ sử dụng envlệnh.
Stéphane Chazelas

1
Vì vậy, để đặt cả hai -9-exz opts, bạn muốn XZ_OPT=-e9nhưng như @kr gia đã chỉ ra, -e cực kỳ chậm
hobs

4
Chỉ dành cho bản ghi: XZ_OPTkhông phải là một tính năng được triển khai trong tar. Đó là một tính năng của xz. Khi targọi xz, biến env chỉ đơn giản được truyền vào.
Sven

14
XZ_OPT=-9e tar cJf tarfile.tar.xz directory

thậm chí còn tốt hơn

XZ_OPT=-9 tar cJf tarfile.tar.xz directory

5
Làm thế nào là tốt hơn? Cờ e làm gì?
cxdf

2
option -e, --extremeSửa đổi cài đặt trước nén (-0 ... -9) để có thể đạt được tỷ lệ nén tốt hơn một chút mà không tăng mức sử dụng bộ nhớ của máy nén hoặc bộ giải nén (ngoại trừ: sử dụng bộ nhớ máy nén có thể tăng một chút với cài đặt trước -0 ... -2). Nhược điểm là thời gian nén sẽ tăng đáng kể (nó có thể dễ dàng tăng gấp đôi).
Evandro Jr

Vì vậy, nếu tôi đang nén khoảng 80 GB phần mềm trên máy của mình (khi tôi muốn tất cả tài nguyên máy tính đi vào quá trình nén cho tốc độ) thì tôi có nên sử dụng -9không -9e, yeah?
nyxee

1
xz theo mặc định sử dụng 1 lõi / chủ đề, bạn có thể tối đa mà ra (tốc độ tất cả lên) bằng cách thêm -T0, ví dụ:XZ_OPT="-9e -T0" tar -cJf ...
EkriirkE

10

Nếu bạn có 16 GiB RAM (và không có gì khác đang chạy), bạn có thể thử:

tar -cf - foo/ | xz --lzma2=dict=1536Mi,nice=273 -c - > foo.tar.xz 

Điều này sẽ cần 1,5 GiB để giải nén và khoảng 11 lần so với nén. Điều chỉnh cho phù hợp với số lượng bộ nhớ ít hơn.

Điều này sẽ chỉ hữu ích nếu dữ liệu thực sự lớn, và trong mọi trường hợp, nó sẽ không giúp được RẤT NHIỀU , nhưng vẫn ...

Nếu bạn đang nén nhị phân, hãy thêm --x86 làm tùy chọn xz đầu tiên. Nếu bạn đang chơi với các tệp "đa phương tiện" (âm thanh không nén hoặc bitmap), bạn có thể thử với --delta = dist = 2 (thử nghiệm với giá trị, các giá trị tốt để thử là 1..4).

Nếu bạn cảm thấy rất phiêu lưu, bạn có thể thử chơi với nhiều tùy chọn LZMA hơn, như

--lzma2=dict=1536Mi,nice=273,lc=3,lp=0,pb=2

(đây là các cài đặt mặc định, bạn có thể thử các giá trị trong khoảng từ 0 đến 4 và lc + lp không được vượt quá 4)

Để xem cách cài đặt mặc định ánh xạ tới các giá trị này, bạn có thể kiểm tra tệp nguồn src / liblzma / lzma / lzma_encoder_presets.c. Không có gì đáng quan tâm ở đó mặc dù (-e đặt độ dài đẹp là 273 và cũng điều chỉnh độ sâu).


6

Bạn có thể thử các tùy chọn khác nhau, đối với tôi -4e hoạt động tốt hơn

tar cf - wam_GG_${dir}.nc | xz -4e > wam_GG_${dir}.nc.tar.xz 

Tôi đã thử nghiệm bằng cách chạy:

$ tar -cf - wam_GG.nc | xz -4e > wam_GG.nc.xz
$ tar -cf - wam_GG.nc | xz -9e > wam_GG.nc.xz.2

Vì vậy, có vẻ như tùy chọn -4e hoạt động tốt hơn một chút so với -9e.

$ ll wam_GG.nc.xz*
-rw-rw-r--. 1 504 504 2707596 Jan 16  2015 wam_GG.nc.xz
-rw-rw-r--. 1 504 504 2708416 Jan 16  2015 wam_GG.nc.xz.2

3
Điều này thực sự không trả lời câu hỏi. Đây chỉ là một quan sát cho tập dữ liệu nhỏ cụ thể của bạn, -4e đã được nén tốt nhất và do đó, các cấp cao hơn sẽ không nhận được bất kỳ lợi ích nào nữa (và thậm chí là một hình phạt rất nhẹ).
psusi

Bạn có phải là người dùng giống như Szymon Roziewski ? Nếu vậy, xin vui lòng không đăng nhiều câu trả lời. Thay vào đó, hãy chỉnh sửa câu trả lời ban đầu của bạn. Nếu bạn không thể truy cập tài khoản đầu tiên của mình, vui lòng xem tại đây để biết cách hợp nhất các tài khoản của bạn. Trong khi đó, tôi đang xóa câu trả lời trước đó của bạn và đưa nó vào đây.
terdon

Ok, tôi đã thực hiện một nghiên cứu toàn diện hơn về điều đó. Những gì tôi nhận được là ở đây. Tôi đã chọn một số tệp từ ổ cứng của mình và thực hiện nén với tùy chọn -4e và -9e. Vì vậy, tốt hơn là bạn nên tự mình tìm giải pháp tốt nhất. Bạn đã đúng, đối với một số trường hợp -9e thì tốt hơn trong khi đối với một trường hợp khác thì không:no difference = 660 4e better than 9e = 74 9e better than 4e = 17 total files = 751 tar 2 html 2 csv 2 xml 2 gz 2 ppt 2 eps 2 docx 2 gif 2 rpm 3 png 3 asv 3 xlsx 3 exe 3 rar 4 nc 4 txt 5 odt 6 xls 7 zip 7 doc 9 m 12 dat 17 other 109 pdf 133 135 jpg 270
Szymon Roziewski

(bình luận có thể được chỉnh sửa chỉ trong 5 phút)txt 109 txt/pdf 135
Szymon Roziewski

2
+1. Điều này giúp OP tìm cách xác định nén tối đa cho tarcác tệp ing bằng cách sử dụng xz.
cychoi

5

tar --help : -I, --use-compress-program=PROG

tar -I 'xz -9' -cvf foo.tar.xz foo/  
tar -I 'gzip -9' -cvf foo.tar.gz foo/    

cũng nén với máy nén ngoài:

tar -I 'lz4 -9' -cvf foo.tar.lz4 foo/
tar -I 'zstd -19' -cvf foo.tar.zst foo/

giải nén máy nén ngoài:

tar -I lz4 -xvf foo.tar.lz4  
tar -I zstd -xvf foo.tar.zst  

danh sách lưu trữ máy nén ngoài:

tar -I lz4 -tvf foo.tar.lz4
tar -I zstd -tvf foo.tar.zst

1
Đây có vẻ như là một câu trả lời hoạt động, nhưng, vì nó là, nó sẽ được cải thiện rất nhiều bằng cách sửa định dạng của nó và giải thích về tùy chọn -Iđược thêm vào.
dhag

4

tarlệnh sử dụng Jcờ cho các tệp xz. Một ví dụ:

tar -cJvf foo.tar.xz foo/


2
Điều Jnày đã được đề cập trong câu trả lời của bdowning
Anthon

3

Đối với những người quan tâm, -e9nhỏ hơn 0,4%, chậm hơn 20% khi nén, chậm hơn 3% khi giải nén, so với -9trên một máy tính xách tay thông thường. Đây là thời gian chạy trên cấu trúc thư mục mã nguồn Python.

Nén:

$ Tbefore=`date +%s%3N` && XZ_OPT=-9 tar cJf python3.6.tar.9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
43.87
$ Tbefore=`date +%s%3N` && XZ_OPT=-e9 tar cJf python3.6.tar.e9xz Python-3.6.0 && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"
53.861

Giảm bớt sức ép:

$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.395
$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf python3.6.tar.e9xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)"  && rm -rf Python-3.6.0
1.443

Kích thước tập tin:

$ rm -rf Python-3.6.0
$ Tbefore=`date +%s%3N` && tar xf Python-3.6.0.tar.xz && Tafter=`date +%s%3N`
$ python -c "print((float($Tafter) - float($Tbefore)) / 1000.)" && rm -rf Python-3.6.0
1.49
$ ls -al ?ython*
-rw-rw-r-- 1 hobs hobs 16378500 Dec 23 13:06 python3.6.tar.9xz
-rw-rw-r-- 1 hobs hobs 16314420 Dec 23 13:05 python3.6.tar.e9xz
-rw-rw-r-- 1 hobs hobs 16805836 Dec 23 12:24 Python-3.6.0.tar.xz

1
Chọn tên biến xấu, vì T0 là tùy chọn để cho phép lưu trữ đa luồng.
Dzenly

@Dzenly Bạn nói đúng! Cảm ơn bạn! Đã thay đổi nó.
hobs

2

Đây không phải là một câu trả lời chính xác cho câu hỏi của bạn nhưng bạn có thể sử dụng một lệnh thay vì hai:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on archive.7z dir1

thêm tất cả các tệp từ thư mục "dir1" vào kho lưu trữ.7z bằng cách sử dụng "ultras settings"

các định dạng khác được hỗ trợ là: zip, gzip, bzip2 hoặc tar. cho điều này chỉ cần thay thế 7zsau -t.
- nguồnman 7z

LƯU Ý: không sử dụng lệnh này để sao lưu các tệp hệ thống của bạn ngoại trừ các tệp cá nhân vì định dạng 7z không lưu trữ các quyền của hệ thống tệp .


5
Câu hỏi là về xz, không phải về 7z, mặc dù cả hai đều sử dụng nén LZMA.
Amedee Van Gasse

2

Trong máy đa lõi từ phiên bản v5.2.0 của xz-utils, hãy kiểm tra:

-T, --threads=NUM   use at most NUM threads; the default is 1; set to 0

Nếu bạn muốn sử dụng số lượng lõi tối đa và nén tối đa:

export XZ_DEFAULTS="-9 -T 0 "

Hoặc đặt -T thành số lõi bạn muốn sử dụng.

Sau đó:

tar cJf target.tar.xz source

Ngoài ra, điều này có thể hữu ích để chọn mức nén:

https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


1

Nếu bạn muốn điều này hoàn thành nhanh hơn, sử dụng nhiều luồng, nhưng không làm chậm hệ thống của bạn trong khi bạn thực hiện công việc khác, hãy thử thêm -Tnn là bao nhiêu luồng bạn muốn sử dụng, cũng như nicegiảm mức độ nén cho mức độ ưu tiên nhàn rỗi.

Mô hình (cho 4 chủ đề):

tar c foo/ | nice -n19 xz -9 -T4 > foo.tar.xz

Hãy thử xem trong tophoặc htopkhi bạn làm điều này trong một thư mục lớn (vài GB). Bạn hy vọng sẽ thấy một số xzchủ đề có giá trị Nice là 19 (mức ưu tiên thấp nhất).

Tôi cũng đã loại bỏ điều này xuống một cách ngắn gọn như hợp lý, chẳng hạn như: -f -các câu trả lời khác đơn giản là không cần thiết, vì tarđầu ra mặc định của nó là thiết bị xuất chuẩn.

Bạn cũng có thể nicexử lý tar, nhưng tôi chưa bao giờ thấy cần thiết, vì xzluôn luôn làm tắc nghẽn CPU cho đường ống.

Lưu ý thực tế, tôi hiếm khi sử dụng xz -9cho bất cứ điều gì, không quá nhiều do CPU hoặc thời gian, nhưng vì nhu cầu bộ nhớ cao. Hãy xem https://catchchallenger.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO#Memory_Vquirements_on_compression . Máy xznén, giống như bzip2, nhưng không giống như gzip, sử dụng nhiều bộ nhớ hơn cho các yếu tố nén cao hơn. Đặt nó cùng với việc xzsử dụng bộ nhớ nhiều hơn bất kỳ máy nén nào khác, bạn có thể dễ dàng sử dụng hơn 600 MB bộ nhớ. Và nếu bạn sử dụng -Tđể cho phép nén luồng, nhu cầu bộ nhớ sẽ tăng hơn nữa. Chỉ cần lưu ý một chút, như nếu bạn đang chạy một số dịch vụ nhỏ trên máy ảo nhỏ có bộ nhớ 1-2 GB, bạn có thể vô tình gây ra tác động.


1

Trên Mac OS X, một cách tiếp cận khác để truyền tham số tarlà sử dụng --options=cờ. Ví dụ,

tar Jcvf targetFileName.tar.xz --options='compression-level=9' directoryName
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.