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 tar
vì 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
?
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 tar
vì 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
?
Câu trả lời:
Giả sử xz
tô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
-9e
là cấp độ tốt nhất, nhưng sẽ mất rất nhiều thời gian
-9e
sẽ 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
--threads=0
vào xz
Với một GNU gần đây tar
trê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_OPT
môi trường cho phép bạn đặt xz
cá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 xz
cá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
rc
và akanga
. fish
, csh
, tcsh
Và es
là vỏ lớn mà không hỗ trợ nó. Ở đó, bạn sẽ sử dụng env
lệnh.
-9
và -e
xz opts, bạn muốn XZ_OPT=-e9
nhưng như @kr gia đã chỉ ra, -e cực kỳ chậm
XZ_OPT
khô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 tar
gọi xz
, biến env chỉ đơn giản được truyền vào.
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
option -e, --extreme
Sử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).
-9
không -9e
, yeah?
XZ_OPT="-9e -T0" tar -cJf ...
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).
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
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
txt 109 txt/pdf 135
tar
các tệp ing bằng cách sử dụng xz
.
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
-I
được thêm vào.
tar
lệnh sử dụng J
cờ cho các tệp xz. Một ví dụ:
tar -cJvf foo.tar.xz foo/
J
này đã được đề cập trong câu trả lời của bdowning
Đối với những người quan tâm, -e9
nhỏ 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 -9
trê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
Đâ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ế 7z
sau -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 .
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:
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 -Tn
n là bao nhiêu luồng bạn muốn sử dụng, cũng như nice
giả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 top
hoặc htop
khi 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ố xz
chủ đề 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ể nice
xử lý tar, nhưng tôi chưa bao giờ thấy cần thiết, vì xz
luô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 -9
cho 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 xz
né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 xz
sử 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.
man 1 xz
nóiit'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.