XZ(1) | Utilități XZ | XZ(1) |
xz, unxz, xzcat, lzma, unlzma, lzcat - Comprimă sau decomprimă fișiere .xz și .lzma
xz [opțiune...] [fișier...]
unxz este echivalent cu xz --decompress.
xzcat este echivalent cu xz --decompress --stdout.
lzma este echivalent cu xz --format=lzma.
unlzma este echivalent cu xz --format=lzma --decompress.
lzcat este echivalent cu xz --format=lzma --decompress
--stdout.
Când scrieți scripturi care trebuie să decomprime fișiere, este recomandat să folosiți întotdeauna comanda xz cu argumentele adecvate (xz -d sau xz -dc) în loc de comenzile unxz și xzcat.
xz este un instrument de comprimare a datelor de uz general cu sintaxă de linie de comandă similară cu gzip(1) și bzip2(1). Formatul de fișier nativ este formatul .xz, dar formatul vechi .lzma folosit de LZMA Utils și fluxurile comprimate brute fără anteturi de format container sunt de asemenea acceptate. În plus, este acceptată decomprimarea formatului .lz folosit de lzip.
xz comprimă sau decomprimă fiecare fișier în funcție de modul de operare selectat. Dacă nu sunt date fișiere sau fișier este -, xz citește de la intrarea standard și scrie datele procesate la ieșirea standard. xz va refuza (afișează o eroare și omite fișier) să scrie date comprimate la ieșirea standard dacă este un terminal. În mod similar, xz va refuza să citească datele comprimate de la intrarea standard dacă este un terminal.
Cu excepția cazului în care este specificată opțiunea --stdout, fișierele altele decât - sunt scrise într-un fișier nou al cărui nume este derivat din numele fișierului sursă:
Dacă fișierul țintă există deja, este afișată o eroare și fișier este omis.
Cu excepția cazului în care scrie la ieșirea standard, xz va afișa un avertisment și va omite fișierul dacă se aplică oricare dintre următoarele:
După comprimarea sau decomprimarea cu succes a fișierului, xz copiază proprietarul, grupul, permisiunile, timpul de acces și timpul de modificare din fișierul sursă în fișierul țintă. Dacă copierea grupului eșuează, permisiunile sunt modificate astfel încât fișierul țintă să nu devină accesibil utilizatorilor care nu aveau permisiunea de a accesa fișierul sursă. xz nu acceptă încă copierea altor metadate, cum ar fi listele de control al accesului sau atributele extinse.
Odată ce fișierul țintă a fost închis cu succes, fișierul sursă este eliminat dacă nu a fost specificată opțiunea --keep. Fișierul sursă nu este niciodată eliminat dacă rezultatul este scris la ieșirea standard sau dacă apare o eroare.
Trimiterea unui semnal SIGINFO sau SIGUSR1 către procesul xz face ca acesta să imprime informații despre progres la ieșirea de eroare standard. Acest lucru are o utilizare limitată, deoarece atunci când ieșirea de eroare standard este un terminal, folosind opțiunea --verbose va afișa un indicator de progres de actualizare automată.
Cantitatea de memorie utilizată de xz variază de la câteva sute de kiloocteți la câțiva gigaocteți, în funcție de opțiunile de comprimare. Opțiunile utilizate la comprimarea unui fișier determină cerințele de memorie ale instrumentului de decomprimare. De obicei, instrumentul de decomprimare are nevoie de 5% până la 20% din cantitatea de memorie de care a avut nevoie instrumentul de comprimare la crearea fișierului. De exemplu, decomprimarea unui fișier creat cu xz -9 necesită în prezent 65Mio de memorie. Totuși, este posibil să aveți fișiere .xz care necesită câțiva gigaocteți de memorie pentru decomprimare.
În special utilizatorii de sisteme mai vechi pot considera deranjantă posibilitatea unei utilizări foarte mari a memoriei. Pentru a preveni surprizele neplăcute, xz are încorporat un limitator de utilizare a memoriei, care este dezactivat implicit. În timp ce unele sisteme de operare oferă modalități de a limita utilizarea memoriei proceselor, bazarea pe aceasta nu a fost considerată a fi suficient de flexibilă (de exemplu, utilizarea ulimit(1) pentru a limita memoria virtuală tinde să paralizeze mmap(2)).
Limitatorul de utilizare a memoriei poate fi activat cu opțiunea din linia de comandă --memlimit=limita. Adesea este mai convenabil să activați limitatorul în mod implicit prin definirea variabilei de mediu XZ_DEFAULTS, de exemplu, XZ_DEFAULTS=--memlimit=150MiB. Este posibil să stabiliți limitele separat pentru comprimare și decomprimare folosind --memlimit-compress=limita și --memlimit-decompress=limita. Utilizarea acestor două opțiuni în afara XZ_DEFAULTS este foarte rar utilă, deoarece o singură rulare a xz nu poate face atât comprimarea, cât și decomprimarea și --memlimit=limita (sau -M limita ) este mai scurt de tastat pe linia de comandă.
Dacă limita de utilizare a memoriei specificată este depășită la decomprimare, xz va afișa o eroare și decomprimarea fișierului va eșua. Dacă limita este depășită la comprimare, xz va încerca să reducă valorile stabilite astfel încât limita să nu mai fie depășită (cu excepția cazului în care se utilizează opțiunea --format=raw sau --no-adjust). În acest fel, operațiunea nu va eșua decât dacă limita stabilită este foarte mică. Scalarea valorilor stabilite se face în pași care nu se potrivesc cu valorile prestabilite ale nivelului de comprimare, de exemplu, dacă limita este doar puțin mai mică decât cantitatea necesară pentru xz -9, valorile stabilite vor fi reduse doar puțin , nu până la valoarea prestabilită a lui xz -8.
Este posibil să concatenați fișierele .xz așa cum sunt. xz va decomprima astfel de fișiere ca și cum ar fi un singur fișier .xz.
Este posibil să se introducă umplutură între părțile concatenate sau după ultima parte. Umplutura trebuie să fie compusă din octeți nuli, iar dimensiunea umpluturii trebuie să fie un multiplu de patru octeți. Acest lucru poate fi util, de exemplu, dacă fișierul .xz este stocat pe un mediu care măsoară dimensiunile fișierelor în blocuri de 512 de octeți.
Concatenarea și completarea nu sunt permise cu fișierele .lzma sau fluxurile brute.
În majoritatea locurilor în care este de așteptat un număr întreg ca argument, un sufix opțional este acceptat pentru a indica cu ușurință numerele întregi mari. Nu trebuie să existe spațiu între numărul întreg și sufix.
Valoarea specială max poate fi utilizată pentru a indica valoarea maximă întreagă suportată de opțiune.
Dacă sunt date mai multe opțiuni de mod de funcționare, ultima dintre ele, este cea care va avea efect.
ValPrestab | DimDict | CPUComp | MemComp | MemDec |
-0 | 256 KiB | 0 | 3 MiB | 1 MiB |
-1 | 1 MiB | 1 | 9 MiB | 2 MiB |
-2 | 2 MiB | 2 | 17 MiB | 3 MiB |
-3 | 4 MiB | 3 | 32 MiB | 5 MiB |
-4 | 4 MiB | 4 | 48 MiB | 5 MiB |
-5 | 8 MiB | 5 | 94 MiB | 9 MiB |
-6 | 8 MiB | 6 | 94 MiB | 9 MiB |
-7 | 16 MiB | 6 | 186 MiB | 17 MiB |
-8 | 32 MiB | 6 | 370 MiB | 33 MiB |
-9 | 64 MiB | 6 | 674 MiB | 65 MiB |
ValPrestab | DimDict | CPUComp | MemComp | MemDec |
-0e | 256 KiB | 8 | 4 MiB | 1 MiB |
-1e | 1 MiB | 8 | 13 MiB | 2 MiB |
-2e | 2 MiB | 8 | 25 MiB | 3 MiB |
-3e | 4 MiB | 7 | 48 MiB | 5 MiB |
-4e | 4 MiB | 8 | 48 MiB | 5 MiB |
-5e | 8 MiB | 7 | 94 MiB | 9 MiB |
-6e | 8 MiB | 8 | 94 MiB | 9 MiB |
-7e | 16 MiB | 8 | 186 MiB | 17 MiB |
-8e | 32 MiB | 8 | 370 MiB | 33 MiB |
-9e | 64 MiB | 8 | 674 MiB | 65 MiB |
Un lanț de filtrare personalizat permite specificarea parametrilor de comprimare în detaliu, în loc să se bazeze pe cei asociați opțiunilor prestabilite. Când este specificat un lanț de filtrare personalizat, opțiunile prestabilite (-0 ... -9 și --extreme) de mai devreme din linia de comandă sunt uitate. Dacă o opțiune prestabilită este specificată după una sau mai multe opțiuni de lanț de filtrare personalizat, noua prestabilire intră în vigoare și opțiunile lanțului de filtrare personalizat, specificate mai devreme sunt uitate.
Un lanț de filtrare este comparabil cu conductele din linia de comandă. La comprimare, intrarea necomprimată merge la primul filtru, a cărui ieșire merge la următorul filtru (dacă există). Ieșirea ultimului filtru este scrisă în fișierul comprimat. Numărul maxim de filtre din lanț este de patru, dar de obicei un lanț de filtrare are doar unul sau două filtre.
Multe filtre au limitări în ceea ce privește locul în care se pot afla în lanțul de filtrare: unele filtre pot funcționa doar ca ultimul filtru din lanț, altele doar ca non-ultim filtru și unele funcționează în orice poziție din lanț. În funcție de filtru, această limitare este fie inerentă proiectării filtrului, fie există pentru a preveni problemele de securitate.
Un lanț de filtrare personalizat este specificat utilizând una sau mai multe opțiuni de filtrare în ordinea în care sunt cerute în lanțul de filtrare. Adică, ordinea opțiunilor de filtrare este semnificativă! La decodificarea fluxurilor brute (--format=raw), lanțul de filtrare este specificat în aceeași ordine în care a fost specificat la comprimare.
Filtrele iau opțiuni specifice filtrului ca o listă separată prin virgule. Virgulele suplimentare din opțiuni sunt ignorate. Fiecare opțiune are o valoare implicită, așa că trebuie să specificați numai cele pe care doriți să le modificați.
Pentru a vedea întregul lanț de filtre și opțiuni, utilizați xz -vv (adică folosiți --verbose de două ori). Acest lucru funcționează și pentru vizualizarea opțiunilor lanțului de filtre utilizate de valorile prestabilite.
Filtru | Aliniere | Note |
x86 | 1 | x86 pe 32 de biți |
sau 64 de biți | ||
ARM | 4 | |
ARM-Thumb | 2 | |
ARM64 | 4 | alinierea pe 4096-octeți |
este cea mai bună | ||
PowerPC | 4 | Doar big endian |
IA-64 | 16 | Itanium |
SPARC | 4 |
Modul robot este activat cu opțiunea --robot. Face ieșirea lui xz mai ușor de analizat de către alte programe. În prezent, opțiunea --robot este acceptată numai împreună cu opțiunile --version, --info-memory și --list. Va fi acceptată pentru comprimare și decomprimare în viitor.
xz --robot --version va afișa numărul versiunii xz și liblzma în următorul format:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
XYYYZZZS sunt aceleași pe ambele linii dacă xz și liblzma sunt din aceeași versiune XZ Utils.
Exemple: 4.999.9beta este 49990091 și 5.0.0 este 50000002.
xz --robot --info-memory tipărește o singură linie cu trei coloane separate prin tabulatori:
În viitor, rezultatul xz --robot --info-memory poate avea mai multe coloane, dar niciodată mai mult de o singură linie.
xz --robot --list utilizează o ieșire separată de tabulatori. Prima coloană a fiecărei linii are un șir care indică tipul de informații găsite pe acea linie:
Coloanele din liniile file:
Coloanele din liniile stream:
Coloanele din liniile block:
Dacă opțiunea --verbose a fost specificată de două ori, coloane suplimentare sunt incluse pe liniile block. Acestea nu sunt afișate cu o singură specificare a opțiunii --verbose, deoarece obținerea acestor informații necesită multe căutări și, prin urmare, poate fi lentă:
Coloanele din liniile summary:
Începând cu xz 5.1.2alpha:
Coloanele din linia totals:
Dacă opțiunea --verbose a fost specificată de două ori, pe linia totals sunt incluse coloane suplimentare:
Începând cu xz 5.1.2alpha:
Versiunile viitoare pot adăuga noi tipuri de linii și pot fi adăugate coloane noi la tipurile de linii existente, dar coloanele existente nu vor fi modificate.
Notificările (nu avertismentele sau erorile) afișate la ieșirea de eroare standard nu afectează starea de ieșire.
xz analizează liste de opțiuni separate prin spații din variabilele de mediu XZ_DEFAULTS și XZ_OPT, în această ordine, înainte de a analiza opțiunile din linia de comandă. Rețineți că numai opțiunile sunt analizate din variabilele de mediu; toate non-opțiunile sunt ignorate în tăcere. Analiza se face cu funcția getopt_long(3) care este folosită și pentru argumentele liniei de comandă.
XZ_OPT=-2v tar caf foo.tar.xz foo
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
Sintaxa liniei de comandă a lui xz este practic o super-colecție de lzma, unlzma și lzcat așa cum se găsește în LZMA Utils 4.32.x. În cele mai multe cazuri, este posibil să înlocuiți LZMA Utils cu XZ Utils fără a întrerupe scripturile existente. Există totuși unele incompatibilități, care uneori pot cauza probleme.
Numerotarea nivelurilor de comprimare prestabilite nu este identică în xz și LZMA Utils. Cea mai importantă diferență este modul în care dimensiunile dicționarului sunt atribuite diferitelor niveluri prestabilite. Dimensiunea dicționarului este aproximativ egală cu memoria utilizată la decomprimare.
Nivel | xz | LZMA Utils |
-0 | 256 KiB | N/A |
-1 | 1 MiB | 64 KiB |
-2 | 2 MiB | 1 MiB |
-3 | 4 MiB | 512 KiB |
-4 | 4 MiB | 1 MiB |
-5 | 8 MiB | 2 MiB |
-6 | 8 MiB | 4 MiB |
-7 | 16 MiB | 8 MiB |
-8 | 32 MiB | 16 MiB |
-9 | 64 MiB | 32 MiB |
Diferențele de dimensiune a dicționarului afectează deasemenea cantitatea de memorie utilizată la comprimare dar există și alte diferențe între LZMA Utils și XZ Utils, care fac diferența și mai mare:
Nivel | xz | LZMA Utils 4.32.x |
-0 | 3 MiB | N/A |
-1 | 9 MiB | 2 MiB |
-2 | 17 MiB | 12 MiB |
-3 | 32 MiB | 12 MiB |
-4 | 48 MiB | 16 MiB |
-5 | 94 MiB | 26 MiB |
-6 | 94 MiB | 45 MiB |
-7 | 186 MiB | 83 MiB |
-8 | 370 MiB | 159 MiB |
-9 | 674 MiB | 311 MiB |
Nivelul prestabilit implicit în LZMA Utils este -7, în timp ce în XZ Utils este -6, deci ambele folosesc un dicționar de 8Mio în mod implicit.
Dimensiunea necomprimată a fișierului poate fi stocată în antetul .lzma. LZMA Utils face asta atunci când comprimă fișiere obișnuite. Alternativa este să marcați că dimensiunea necomprimată este necunoscută și să folosiți marcajul de sfârșit de încărcare pentru a indica unde ar trebui să se oprească decomprimarea. LZMA Utils folosește această metodă atunci când dimensiunea necomprimată nu este cunoscută, ceea ce este cazul, de exemplu, când se folosesc conducte.
xz acceptă decomprimarea fișierelor .lzma cu sau fără marcaj de sfârșit de încărcare, dar toate fișierele .lzma create de xz vor folosi marcajul de sfârșit de încărcare și vor avea dimensiunea necomprimată marcată ca necunoscută în antetul .lzma. Aceasta poate fi o problemă în unele situații mai puțin frecvente. De exemplu, un instrument de decomprimare .lzma încorporat într-un dispozitiv poate funcționa numai cu fișiere care au dimensiunea necomprimată cunoscută. Dacă întâmpinați această problemă, trebuie să utilizați LZMA Utils sau LZMA SDK pentru a crea fișiere .lzma cu dimensiunea necomprimată cunoscută.
Formatul .lzma permite valori lc de până la 8 și valori lp de până la 4. LZMA Utils poate decomprima fișiere cu orice lc și lp, dar creează întotdeauna fișiere cu lc=3 și lp=0. Crearea de fișiere cu alte lc și lp este posibilă cu xz și cu LZMA SDK.
Implementarea filtrului LZMA1 în liblzma necesită ca suma lc și lp să nu depășească 4. Altfel, fișierele .lzma, care depășesc această limitare, nu pot fi decomprimate cu xz.
LZMA Utils creează numai fișiere .lzma care au o dimensiune de dicționar de 2^n (o putere de 2), dar acceptă fișiere cu orice dimensiune de dicționar. liblzma acceptă numai fișierele .lzma care au dimensiunea de dicționar de 2^n sau 2^n + 2^(n-1). Acest lucru este pentru a reduce numărul de „fals pozitiv” atunci când se detectează fișiere .lzma.
Aceste limitări nu ar trebui să fie o problemă în practică, deoarece practic toate fișierele .lzma au fost comprimate cu opțiuni pe care liblzma le va accepta.
Când decomprimă, LZMA Utils ignoră în tăcere totul după primul flux .lzma. În majoritatea situațiilor, aceasta este o eroare. Aceasta înseamnă, de asemenea, că LZMA Utils nu acceptă decomprimarea fișierelor .lzma concatenate.
Dacă au rămas date după primul flux .lzma, xz consideră că fișierul este corupt, cu excepția cazului în care a fost utilizată opțiunea --single-stream. Acest lucru poate rupe scripturile obscure(scrise deficitar) care presupun că resturile rămase sunt ignorate.
Ieșirea exactă comprimată produsă din același fișier de intrare necomprimat poate varia între versiunile XZ Utils, chiar dacă opțiunile de comprimare sunt identice. Acest lucru se datorează faptului că instrumentul codificator poate fi îmbunătățit (comprimare mai rapidă sau mai bună) fără a afecta formatul fișierului. Ieșirea poate varia chiar și între compilările diferite ale aceleiași versiuni XZ Utils, dacă sunt utilizate opțiuni diferite de compilare.
Cele de mai sus înseamnă că odată ce opțiunea --rsyncable a fost utilizată, fișierele rezultate nu vor fi neapărat sincronizate cu rsync decât dacă atât fișierele vechi, cât și cele noi au fost comprimate cu aceeași versiune xz. Această problemă poate fi remediată dacă o parte a implementării codificatorului este înghețată pentru a menține stabilă ieșirea „rsyncabilă” între versiunile xz.
Implementările instrumentului de decomprimare .xz încorporat, cum ar fi XZ Embedded, nu acceptă neapărat fișiere create cu tipuri de verificare a integrității, altele decât none și crc32. Deoarece valoarea implicită este --check=crc64, trebuie să utilizați --check=none sau --check=crc32 atunci când creați fișiere pentru sistemele încorporate.
În afara sistemelor încorporate, toate instrumentele de decomprimare în format .xz acceptă toate tipurile de verificare sau cel puțin pot decomprima fișierul fără a efectua verificarea integrității dacă acel tip de verificare nu este acceptat.
XZ Embedded acceptă filtre BCJ, dar numai cu poziție de pornire implicită.
Comprimă fișierul foo în foo.xz folosind nivelul de comprimare implicit (-6) și elimină fișierul foo dacă comprimarea are succes:
xz foo
Decomprimă bar.xz în bar și nu elimină bar.xz chiar dacă decomprimarea este efectuată cu succes:
xz -dk bar.xz
Creează baz.tar.xz cu nivelul prestabilit -4e (-4 --extreme), care este mai lent decât nivelul prestabilit implicit -6, dar necesită mai puțină memorie pentru comprimare și decomprimare (48Mio și, respectiv, 5Mio):
tar cf - baz | xz -4e > baz.tar.xz
Un amestec de fișiere comprimate și necomprimate poate fi decomprimat la ieșirea standard cu o singură comandă:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
În sisteme GNU și *BSD, find(1) și xargs(1) pot fi utilizate pentru a paraleliza comprimarea mai multor fișiere:
find . -type f \! -name '*.xz' -print0 \ | xargs -0r -P4 -n16 xz -T1
Opțiunea -P pentru comanda xargs(1) stabilește numărul de procese paralele xz. Cea mai bună valoare pentru opțiunea -n depinde de câte fișiere trebuie să fie comprimate. Dacă există doar câteva fișiere, valoarea ar trebui probabil să fie 1; cu zeci de mii de fișiere, 100 sau chiar mai mult poate să fie valoarea potrivită pentru a reduce numărul de procese xz pe care xargs(1) le va crea în final.
Opțiunea -T1 pentru xz este acolo pentru a-l forța să ruleze în modul cu un singur fir de execuție, deoarece xargs(1) este folosit pentru a controla cantitatea de paralelizare.
Calculează câți octeți au fost salvați în total după comprimarea mai multor fișiere:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
Un script poate dori să afle dacă folosește o versiune xz suficient de nouă. Următorul script sh(1) verifică dacă numărul versiunii instrumentului xz este cel puțin 5.0.0. Această metodă este compatibilă cu versiunile beta vechi, care nu acceptau opțiunea --robot:
if ! eval "$(xz --robot --version 2> /dev/null)" || [ "$XZ_VERSION" -lt 50000002 ]; then echo "Versiunea dumneavoastră de „xz” este prea veche!" fi unset XZ_VERSION LIBLZMA_VERSION
Stabilește o limită de utilizare a memoriei pentru decomprimare folosind variabila de mediu XZ_OPT, dar dacă o limită a fost deja stabilită, nu o mărește:
NEWLIM=$((123 << 20)) # 123 MiB OLDLIM=$(xz --robot --info-memory | cut -f3) if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM" export XZ_OPT fi
Cea mai simplă utilizare a lanțurilor de filtrare personalizate este personalizarea unei opțiuni prestabilite LZMA2. Acest lucru poate fi util, deoarece opțiunile prestabilite acoperă doar un subset al combinațiilor potențial utile de opțiuni de comprimare.
Coloanele CPUComp din tabelele de descriere a opțiunilor -0 ... -9 și --extreme sunt utile atunci când personalizați opțiunilor prestabilite LZMA2. Iată părțile relevante colectate din aceste două tabele:
ValPrestab | CPUComp |
-0 | 0 |
-1 | 1 |
-2 | 2 |
-3 | 3 |
-4 | 4 |
-5 | 5 |
-6 | 6 |
-5e | 7 |
-6e | 8 |
Dacă știți că un fișier necesită un dicționar oarecum mare (de exemplu, 32Mio) pentru a se comprima bine, dar doriți să-l comprimați mai repede decât ar face xz -8, o opțiune prestabilită cu o valoare CPUComp scăzută (de exemplu, 1) poate fi modificată pentru a utiliza un dicționar mai mare:
xz --lzma2=preset=1,dict=32MiB foo.tar
Cu anumite fișiere, comanda de mai sus poate fi mai rapidă decât xz -6 în timp ce comprimă semnificativ mai bine. Cu toate acestea, trebuie subliniat că doar unele fișiere se beneficiază de un dicționar mare, păstrând în același timp valoarea CPUComp scăzută. Cea mai evidentă situație, în care un dicționar mare poate ajuta foarte mult, este o arhivă care conține fișiere foarte asemănătoare de cel puțin câțiva megaocteți fiecare. Dimensiunea dicționarului trebuie să fie semnificativ mai mare decât orice fișier individual pentru a permite LZMA2 să profite din plin de asemănările dintre fișierele consecutive.
Dacă utilizarea unei mari cantități de memorie pentru comprimare și decomprimare este în regulă, iar fișierul comprimat are cel puțin câteva sute de megaocteți, poate fi util să folosiți un dicționar și mai mare decât cei 64Mio pe care i-ar folosi xz -9:
xz -vv --lzma2=dict=192MiB big_foo.tar
Utilizarea opțiunii -vv (--verbose --verbose) ca în exemplul de mai sus, poate fi utilă pentru a vedea cerințele de memorie la comprimare și decomprimare. Amintiți-vă că utilizarea unui dicționar mai mare decât dimensiunea fișierului necomprimat este risipă de memorie, de aceea, comanda de mai sus nu este utilă pentru fișiere mici.
Uneori, timpul de comprimare nu contează, dar utilizarea memoriei la decomprimare trebuie menținută la un nivel scăzut, de exemplu, pentru a face posibilă decomprimarea fișierului pe un sistem încorporat. Următoarea comandă folosește -6e (-6 --extreme) ca bază și fixează dimensiunea dicționarului la doar 64Kio. Fișierul rezultat poate fi decomprimat cu XZ Embedded (de aceea există --check=crc32) folosind aproximativ 100Kio de memorie.
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
Dacă doriți să stoarceți cât mai mulți octeți posibil, ajustarea numărului de biți de context literal (lc) și a numărului de biți de poziție (pb) poate ajuta uneori. Ajustarea numărului de biți de poziție literală (lp) ar putea ajuta, de asemenea, dar de obicei lc și pb sunt mai importante. De exemplu, o arhivă de cod sursă conține în mare parte text US-ASCII, așa că ceva precum comanda următoare, ar putea oferi un fișier „mai slăbuț” (aproximativ cu 0,1%) mai mic decât cu xz -6e (încercați și fără lc=4):
xz --lzma2=preset=6e,pb=0,lc=4 fișierul_sursă.tar
Utilizarea unui alt filtru împreună cu LZMA2 poate îmbunătăți comprimarea cu anumite tipuri de fișiere. De exemplu, pentru a comprima o bibliotecă partajată x86 pe 32 de biți sau x86 pe 64 de biți folosind filtrul BCJ x86:
xz --x86 --lzma2 libfoo.so
Rețineți că ordinea opțiunilor de filtrare este semnificativă. Dacă --x86 este specificată după --lzma2, xz va da o eroare, deoarece nu poate exista niciun filtru după LZMA2 și, de asemenea, pentru că filtrul x86 BCJ nu poate fi utilizat ca ultimul filtru din lanțul de filtrare.
Filtrul Delta împreună cu LZMA2 pot da rezultate bune cu imagini bitmap. De obicei, ar trebui să întreacă comprimarea PNG, care are câteva filtre mai avansate decât delta simplă, dar utilizează Deflate pentru comprimarea reală.
Imaginea trebuie să fie salvată în format necomprimat, de exemplu, ca TIFF necomprimat. Parametrul de distanță al filtrului Delta este fixat să se potrivească cu numărul de octeți per pixel din imagine. De exemplu, bitmap-ul RGB pe 24 de biți necesită dist=3 și este, de asemenea, bine să pasați pb=0 la LZMA2 pentru a se adapta alinierii pe trei octeți:
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
Dacă mai multe imagini au fost introduse într-o singură arhivă (de exemplu, .tar), filtrul Delta va funcționa și pe aceasta atâta timp cât toate imaginile au același număr de octeți per pixel.
xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)
XZ Utils: <https://tukaani.org/xz/>
XZ Embedded: <https://tukaani.org/xz/embedded.html>
LZMA SDK: <http://7-zip.org/sdk.html>
01.12.2022 | Tukaani |