| XZ(1) | XZ Utils | XZ(1) |
xz, unxz, xzcat, lzma, unlzma, lzcat - Comprime o decomprime file .xz e .lzma
xz [OPZIONE...] [FILE...]
unxz è equivalente a xz --decompress.
xzcat è equivalente a xz --decompress --stdout.
lzma è equivalente a xz --format=lzma.
unlzma è equivalente a xz --format=lzma --decompress.
lzcat è equivalente a xz --format=lzma --decompress
--stdout.
Quando si scrivono script che richiedono di decomprimere file, si raccomanda di utilizzare sempre il comando xz con argomenti appropriati (xz -d o xz -dc) al posto degli alias unxz e xzcat.
xz è uno strumento di compressione dati generico con sintassi della riga di comando simile a gzip(1) e bzip2(1). Il formato file nativo è .xz, ma sono supportati anche il formato tradizionale .lzma usato dalle LZMA Utils e i flussi grezzi (raw) compressi senza intestazioni di formato contenitore. In più, è supportata la decompressione del formato .lzusato da lzip.
xz comprime o decomprime ogni FILE a seconda della modalità di funzionamento selezionata. Se nessun FILE è indicato o se FILE è -, xz legge dallo standard input e scrive i dati processati sullo standard output. xz si rifiuterà (stamperà un errore e salterà il FILE) di scrivere dati compressi sullo standard output se è il terminale. Analogamente, xz si rifiuterà di leggere dati compressi dallo standard input se è il terminale.
A meno che non sia specificato --stdout, i FILE diversi da - vengono scritti in un nuovo file il cui nome deriva dal nome del FILE sorgente:
Se il file di destinazione esiste già, viene visualizzato un errore e FILE viene saltato.
A meno che non si scriva nello standard output, xz visualizzerà un avvertimento e salterà il FILE se si verifica una delle seguenti condizioni:
Dopo aver compresso o decompresso correttamente il FILE, xz copia il proprietario, il gruppo, le autorizzazioni, l'ora di accesso e l'ora di modifica dal FILE di origine al file di destinazione. Se la copia del gruppo fallisce, le autorizzazioni vengono modificate in modo che il file di destinazione non diventi accessibile agli utenti che non disponevano dell'autorizzazione per accedere al FILE di origine. xz non supporta ancora la copia di altri metadati, ad esempio elenchi di controllo degli accessi o attributi estesi.
Una volta che il file di destinazione è stato chiuso con successo, il FILE sorgente viene rimosso, a meno che sia stato specificato --keep. Il FILE sorgente non viene mai rimosso se l'output è scritto sullo standard output, né se si verifica un errore.
L'invio di SIGINFO o SIGUSR1 al processo xz comporta la stampa delle informazioni sullo stato di avanzamento sullo standard error. Questo ha solo un uso limitato poiché quando lo standard error è un terminale, utilizzando --verbose verrà visualizzato un indicatore di avanzamento che si aggiorna automaticamente.
L'utilizzo della memoria di xz varia da poche centinaia di kilobyte a diversi gigabyte a seconda delle impostazioni di compressione. Le impostazioni utilizzate durante la compressione di un file determinano i requisiti di memoria del decompressore. In genere il decompressore richiede dal 5 al 20 della quantità di memoria necessaria al compressore durante la creazione del file. Ad esempio, la decompressione di un file creato con xz -9 al momento richiede 65 MiB di memoria. Ancora, è possibile avere file .xz che richiedono diversi gigabyte di memoria per la decompressione.
Soprattutto gli utenti di sistemi più vecchi possono trovare fastidiosa l'eventualità di un utilizzo molto elevato di memoria. Per evitare spiacevoli sorprese, xz dispone di un limitatore di utilizzo della memoria incorporato, che è disabilitato per impostazione predefinita. Anche se alcuni sistemi operativi forniscono modi per limitare l'utilizzo della memoria dei processi, fare affidamento su questi non è stato ritenuto sufficientemente flessibile (ad esempio, l'uso di ulimit(1) per limitare la memoria virtuale tende a paralizzare mmap(2)).
Il limitatore di utilizzo della memoria può essere abilitato con l'opzione della riga di comando --memlimit=LIMITE. Spesso è più conveniente abilitare il limitatore per impostazione predefinita impostando la variabile d'ambiente XZ_DEFAULTS, ad esempio, XZ_DEFAULTS=--memlimit=150MiB. È possibile impostare separatamente i limiti per la compressione e la decompressione utilizzando --memlimit-compress=LIMITE and --memlimit-decompress=LIMITE. L'uso di queste due opzioni al di fuori di XZ_DEFAULTS è raramente utile perché una singola esecuzione di xz non può eseguire sia la compressione che la decompressione e --memlimit=LIMITE (or -M LIMITE) è più breve da digitare sulla riga di comando.
Se il limite di utilizzo della memoria specificato viene superato durante la decompressione, xz visualizzerà un errore e la decompressione del file fallirà. Se il limite viene superato durante la compressione, xz tenterà di ridimensionare le impostazioni in modo che il limite non venga più superato (tranne quando si usa --format=raw o --no-adjust). In questo modo l'operazione non fallirà a meno che il limite sia molto basso. Il ridimensionamento delle impostazioni viene eseguito in piccole differenze che non corrispondono ai livelli di compressione preimpostati, ad esempio, se il limite è solo leggermente inferiore alla quantità richiesta per xz -9, le impostazioni saranno ridimensionate solo un poco, non proprio fino a xz -8.
È possibile concatenare i file .xz così come sono. xz decomprimerà tali file come se fossero un singolo file .xz.
È possibile inserire un padding tra le parti concatenate o dopo l'ultima parte. Il padding deve essere costituito da byte "null" e la dimensione del padding deve essere un multiplo di quattro byte. Questo può essere utile, ad esempio, se il file .xz è memorizzato su un supporto che misura le dimensioni dei file in blocchi di 512 byte.
Concatenazione e padding non sono permessi con file .lzma o con flussi grezzi.
Nella maggior parte dei casi in cui è previsto un argomento intero, è supportato un suffisso facoltativo per indicare facilmente numeri interi di grandi dimensioni. Non deve esserci alcuno spazio tra il numero intero e il suffisso.
Il valore speciale max può essere utilizzato per indicare il valore intero massimo supportato dall'opzione.
Se vengono fornite più opzioni di modalità operativa, l'ultima ha effetto.
| Livello preimpostato | DictSize | CompCPU | CompMem | DecMem |
| -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 |
| Livello preimpostato | DictSize | CompCPU | CompMem | DecMem |
| -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 |
Una catena di filtri personalizzata consente di specificare in dettaglio le impostazioni di compressione invece di fare affidamento sulle impostazioni associate ai livelli preimpostati. Quando viene specificata una catena di filtri personalizzata, le opzioni relative ai livelli preimpostati (-0 ... -9 e --extreme) specificate in precedenza sulla riga di comando vengono dimenticate. Se un'opzione livello preimpostato viene specificata dopo una o più opzioni della catena di filtri personalizzata, il nuovo livello preimpostato ha effetto e le opzioni della catena di filtri personalizzate specificate in precedenza vengono dimenticate.
Una catena di filtri è paragonabile a una pipe sulla riga di comando. Durante la compressione, l'input non compresso va al primo filtro, il cui output va al filtro successivo (se presente). L'output dell'ultimo filtro viene scritto nel file compresso. Il numero massimo di filtri nella catena è quattro, ma in genere una catena di filtri ha solo uno o due filtri.
Molti filtri hanno limitazioni su dove possono trovarsi nella catena di filtri: alcuni filtri possono funzionare solo come ultimo filtro della catena, altri solo come filtro non ultimo e alcuni funzionano in qualsiasi posizione nella catena. A seconda del filtro, questa limitazione è inerente alla struttura del filtro oppure esiste per evitare problemi di sicurezza.
Una catena di filtri personalizzata può essere specificata in due modi diversi. Le opzioni --filters=FILTRI and --filters1=FILTRI ... --filters9=FILTRI permettono di specificare un'intera catena di filtri in una opzione utilizzando la sintassi della stringa del filtro di lzma. In alternativa, una catena di filtri può essere specificata utilizzando una o più singole opzioni di filtro nell'ordine desiderato nella catena di filtri. Questo significa che l'ordine delle singole opzioni di filtro è importante! Quando si decodificano i flussi grezzi (--format=raw), la catena di filtri deve essere specificata nello stesso ordine in cui è stata specificata durante la compressione. Qualsiasi filtro individuale o opzione livello preimpostato specificata prima dell'opzione della catena completa (--filters=FILTRI) verrà dimenticata. I singoli filtri specificati dopo l'opzione della catena completa reimposteranno la catena di filtri.
Sia l'opzione di filtro completo che quella individuale accettano OPZIONI specifiche del filtro come un elenco separato da virgole. Virgole in eccesso nelle OPZIONI vengono ignorate. Ogni opzione ha un valore di default, quindi occorre specificare solamente quelle che si desidera modificare.
Per vedere l'intera catena di filtri e OPZIONI, usa xz -vv (ossia, usa --verbose due volte). Questo funziona anche per visualizzare le opzioni della catena di filtri utilizzate dai livelli preimpostati.
| Filtro | Allineamento | Note |
| x86 | 1 | 32-bit o 64-bit x86 |
| ARM | 4 | |
| ARM-Thumb | 2 | |
| ARM64 | 4 | L'allineamento migliore è a 4096 byte |
| PowerPC | 4 | Solo big-endian |
| IA-64 | 16 | Itanium |
| SPARC | 4 | |
| RISC-V | 2 |
La "modalità robot" viene attivata con l'opzione --robot. Rende l'output di xz più facile da analizzare da altri programmi. Attualmente --robot è supportato solo insieme a --list, --filters-help, --info-memory e --version. In futuro sarà supportato per la compressione e la decompressione.
xz --robot --list usa un output separato da tabulazione. La prima colonna di ogni riga contiene una stringa che indica il tipo di informazione contenuta in quella riga:
Le colonne delle righe file:
Le colonne delle righe stream:
Le colonne delle righe block:
Se --verbose viene specificato due volte, sono incluse colonne aggiuntive nelle righe block. Queste non sono mostrate con un --verbose singolo, perché recuperare queste informazioni richiede molte ricerche e quindi può essere lento:
Le colonne delle righe summary:
A partire da xz 5.1.2alpha:
Le colonne delle righe totali:
Se --verbose viene specificato due volte, sono incluse colonne aggiuntive nella riga totali:
A partire da xz 5.1.2alpha:
Versioni future potrebbero aggiungere nuovi tipi di riga e nuove colonne possono essere aggiunte ai tipi di riga esistenti, ma le colonne esistenti non verranno modificate.
xz --robot --filters-help stampa i filtri supportati nel seguente formato:
FILTRO:OPZIONE=<VALORE>,OPZIONE=<VALORE>...
Ogni filtro è mostrato su una riga dedicata.
xz --robot --info-memory stampa una singola riga con più colonne separate da tabulazione:
In futuro, l'output di xz --robot --info-memory potrebbe avere più colonne, ma mai più di una singola riga.
xz --robot --version stampa il numero di versione di xz e liblzma nel seguente formato:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
XYYYZZZS sono uguali su entrambe le righe se xz e liblzma appartengono allo stesso rilascio delle XZ Utils.
Esempi: 4.999.9beta è 49990091 e 5.0.0 è 50000002.
Gli avvisi (non gli avvertimenti o gli errori) stampati sullo standard error non influiscono sullo stato di uscita.
xz analizza elenchi di opzioni separate da spazi dalle variabili d'ambiente XZ_DEFAULTS e XZ_OPT, in questo ordine, analizzando prima le opzioni dalla riga di comando. Si noti che solo le opzioni vengono analizzate dalle variabili d'ambiente; tutte le non-opzioni vengono ignorate silenziosamente. L'analisi viene eseguita con getopt_long(3) che viene utilizzato anche per gli argomenti della riga di comando.
Attenzione: Impostando queste variabili di ambiente, si sta di fatto modificando programmi e script che lanciano xz. La maggior parte delle volte va bene impostare i limiti di utilizzo della memoria, il numero di thread e le opzioni di compressione tramite variabili d'ambiente. Tuttavia, alcune opzioni possono rompere degli script. Un esempio banale è --help che forza xz a mostrare la pagina di aiuto anziché comprimere o decomprimere file. Esempi meno ovvi sono --quiet e --verbose. In molti casi funziona bene abilitare l'indicatore di avanzamento usando --verbose, ma in alcune situazioni i messaggi extra creano problemi. Il livello di prolissità influisce anche sul comportamento di --list.
XZ_OPT=-2v tar caf foo.tar.xz foo
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
La sintassi della riga di comando di xz è essenzialmente un sopra-insieme di lzma, unlzma, e lzcat come trovati nelle LZMA Utils 4.32.x. Nella maggior parte dei casi è possibili sostituire le LZMA Utils con le XZ Utils senza rompere gli script esistenti. Ci sono però alcune incompatibilità, che in alcuni casi potrebbero causare problemi.
La numerazione dei livelli di compressione preimpostati non è identica in xz e nelle LZMA Utils. La differenza più importante è il modo in cui le dimensioni del dizionario vengono mappate sulle diverse preimpostazioni. La dimensione del dizionario è approssimativamente uguale all'utilizzo della memoria del decompressore.
| Livello | 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 |
Le differenze di dimensione del dizionario influiscono anche sull'utilizzo della memoria del compressore, ma ci sono alcune altre differenze tra le LZMA Utils e le XZ Utils, che rendono la differenza ancora più grande:
| Livello | 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 |
Il livello preimpostato predefinito nelle LZMA Utils è -7 mentre nelle XZ Utils è -6, quindi entrambi utilizzano un dizionario da 8 MiB per impostazione predefinita.
La dimensione non compressa del file può essere memorizzata nell'intestazione .lzma. Le LZMA Utils lo fanno durante la compressione di file regolari. L'alternativa consiste nel memorizzare che la dimensione non compressa è sconosciuta e utilizzare l'indicatore di fine carico utile per indicare il punto in cui il decompressore deve fermarsi. Le LZMA Utils utilizzano questo metodo quando le dimensioni non compresse non sono note, come nel caso, ad esempio, delle pipe.
xz supporta la decompressione di file .lzma con o senza il marcatore di fine payload, ma tutti i file .lzma creati da xz utilizzeranno il marcatore di fine payload e avranno dimensioni non compresse contrassegnate come sconosciute nell'intestazione .lzma. Questo può essere un problema in alcune situazioni non comuni. Ad esempio, un decompressore .lzma in un dispositivo embedded potrebbe funzionare solo con file con dimensioni non compresse note. Se si incorre in questo problema, occorre utilizzare le LZMA Utils oppure l'LZMA SDK per creare dei file .lzma con dimensioni non compresse note.
Il formato .lzma permette valori lc fino a 8, e valori lp fino a 4. Le LZMA Utils possono decomprimere file con qualunque lc e lp, ma creeranno sempre file con lc=3 e lp=0. Creare file con altri lc e lp è possibile con xz e con l'LZMA SDK.
L'implementazione del filtro LZMA1 in liblzma richiede che la somma di lc e lp non debba superare 4. Pertanto, i file .lzma che superano questa limitazione non possono essere decompressi con xz.
Le LZMA Utils creano solo file .lzma con dimensione del dizionario 2^n (una potenza di 2) ma accettano file con qualsiasi dimensione di dizionario. liblzma accetta solo file .lzma con dimensione del dizionario 2^n o 2^n + 2^(n-1). Questo serve a limitare i falsi positivi quando si cerca di identificare i file .lzma.
All'atto pratico queste limitazioni non dovrebbero essere un problema, perché praticamente tutti i file .lzma sono stati compressi con impostazioni che liblzma accetterà.
Quando si decomprime, le LZMA Utils ignorano automaticamente tutto quello che c'è dopo il primo flusso .lzma. Nella maggior parte delle situazioni questo è un baco. Questo significa anche che le LZMA Utils non supportano la decompressione di file .lzma concatenati.
Se sono rimasti dati dopo il primo flusso .lzma, xz considera il file corrotto a meno che sia stato utilizzato --single-stream. Questo può far rompere script incomprensibili che hanno assunto che i dati sporchi finali vengano ignorati.
L'esatto output compresso prodotto dallo stesso file di input non compresso può variare tra le versioni delle XZ Utils, anche se le opzioni di compressione sono le stesse. Questo perché il codificatore può essere stato migliorato (compressione più veloce o migliore) senza influire sul formato del file. L'output può variare anche tra diverse build della stessa versione delle XZ Utils, se vengono utilizzate opzioni di build differenti.
Quanto sopra significa che una volta che --rsyncable è stato implementato, i file risultanti non saranno necessariamente rsync-abili a meno che sia i vecchi che i nuovi file non siano stati compressi con la stessa versione di xz. Questo problema può essere risolto se una parte dell'implementazione del codificatore viene congelata per mantenere stabile l'output rsync-abile tra le versioni di xz.
Le implementazioni dei decompressori .xz embedded, come XZ Embedded, non necessariamente supportano file creati con tipi di integrità CONTROLLO diversi da none e crc32. Dal momento che il valore predefinito è --check=crc64, occorre specificare --check=none o --check=crc32 quando si creano file per sistemi embedded.
Al di fuori dei sistemi embedded, tutti i decompressori in formato .xz supportano tutti i tipi di CONTROLLO, o almeno sono in grado di decomprimere il file senza verificare il controllo di integrità se il particolare CONTROLLO non è supportato.
XZ Embedded supporta i filtri BCJ, ma solo con offset iniziale predefinito.
Comprime il file foo in foo.xz utilizzando il livello di compressione predefinito (-6) e rimuove foo se la compressione ha esito positivo:
xz foo
Decomprime bar.xz in bar e non rimuove bar.xz anche se la decompressione ha successo:
xz -dk bar.xz
Crea baz.tar.xz con il preset -4e (-4 --extreme), che è più lenta della predefinita -6, ma ha bisogno di meno memoria per la compressione e decompressione (48 MiB e 5 MiB, rispettivamente):
tar cf - baz | xz -4e > baz.tar.xz
Una combinazione di file compressi e non compressi può essere decompressa sullo output standard con un singolo comando:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
Su GNU e *BSD, find(1) e xargs(1) possono essere usati per parallelizzare la compressione di più file:
find . -type f \! -name '*.xz' -print0 \
| xargs -0r -P4 -n16 xz -T1
L'opzione -p di xargs(1) imposta il numero di processi xz paralleli. Il valore migliore per l'opzione -n dipende dal numero di file da comprimere. Se sono presenti solo un paio di file, il valore dovrebbe probabilmente essere 1; con decine di migliaia di file, 100 o anche di più può essere appropriato per ridurre il numero di processi xz che xargs(1) alla fine creerà.
L'opzione -T1 per xz serve a forzare la modalità a thread singola, perché xargs (1) viene utilizzato per controllare la quantità di parallelizzazione.
Calcola quanti byte sono stati salvati in totale dopo la compressione di più file:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
Uno script potrebbe voler sapere se si sta utilizzando una versione di xz sufficientemente recente. Il seguente script sh(1) controlla che il numero di versione dello strumento xz sia almeno 5.0.0. Questo metodo è compatibile con le vecchie versioni beta, che non supportavano l'opzione --robot:
if ! eval "$(xz --robot --version 2> /dev/null)" ||
[ "$XZ_VERSION" -lt 50000002 ]; then
echo "Your xz is too old." fi unset XZ_VERSION LIBLZMA_VERSION
Imposta un limite di utilizzo della memoria per la decompressione utilizzando XZ_OPT, ma se è già stato impostato un limite, non lo aumenta:
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
L'uso più semplice delle catene di filtri personalizzate è la personalizzazione di un preset di LZMA2. Questo può essere utile, perché i preset coprono solamente un sottoinsieme di tutte le combinazioni di impostazioni di compressione potenzialmente utili.
Le colonne CompCPU delle tabelle dalle descrizioni delle opzioni -0 ... -9 e --extreme sono utili quando si personalizzano i preset di LZMA2. Di seguito sono riportate le parti rilevanti raccolte da queste due tabelle:
| Livello preimpostato | CompCPU |
| -0 | 0 |
| -1 | 1 |
| -2 | 2 |
| -3 | 3 |
| -4 | 4 |
| -5 | 5 |
| -6 | 6 |
| -5e | 7 |
| -6e | 8 |
Se si sa che un file richiede un dizionario piuttosto grande (ad esempio, 32 MiB) per essere compresso bene, ma si desidera comprimerlo più velocemente di quanto farebbe xz -8, è possibile modificare un preset con un basso valore CompCPU (ad esempio, 1) per utilizzare un dizionario più grande:
xz --lzma2=preset=1,dict=32MiB foo.tar
Con alcuni file, il comando sopra potrebbe essere più veloce di xz -6 e la compressione significativamente migliore. Tuttavia, si deve sottolineare che solo alcuni file traggono beneficio da un dizionario grande e mantengono basso il valore di CompCPU. La situazione più ovvia in cui un dizionario grande può aiutare molto è un archivio contenente file molto simili di almeno un paio di megabyte ciascuno. La dimensione del dizionario deve essere significativamente più grande di ogni singolo file per permettere a LZMA2 di trarre pieno vantaggio dalle somiglianze tra file consecutivi.
Se l'utilizzo molto elevato della memoria del compressore e del decompressore è accettabile, e il file da comprimere è almeno di diverse centinaia di megabyte, potrebbe essere utile utilizzare un dizionario ancora più grande dei 64 MiB che xz -9 utilizzerebbe:
xz -vv --lzma2=dict=192MiB big_foo.tar
L'uso di -vv (--verbose --verbose) come nell'esempio precedente può essere utile per vedere i requisiti di memoria del compressore e del decompressore. Tenere presente che l'utilizzo di un dizionario più grande della dimensione del file non compresso è uno spreco di memoria, quindi il comando precedente non è utile per i file di piccole dimensioni.
A volte il tempo di compressione non importa, ma l'utilizzo di memoria del decompressore deve essere tenuta bassa, per esempio, per permettere di decomprimere il file in un sistema embedded. Il comando seguente usa -6e (-6 --extreme) come base e imposta il dizionario a soli 64 KiB. Il file risultante può essere decompresso con XZ Embedded (ecco perché c'è --check=crc32) usando circa 100 KiB di memoria.
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
Se si desidera spremere il maggior numero possibile di byte, a volte può essere utile regolare il numero di bit di contesto letterale (lc) e il numero di bit di posizione (pb). Anche la regolazione del numero di bit di posizione letterale (lp) potrebbe essere d'aiuto, ma di solito lc e pb sono più importanti. Per esempio, un archivio di codici sorgente contiene principalmente testo US-ASCII, quindi qualcosa come il seguente potrebbe produrre un file leggermente (0,1 %) più piccolo di xz -6e (provare anche senza lc=4):
xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar
Usare un altro filtro insieme a LZMA2 può migliorare la compressione per alcuni tipi di file. Ad esempio, per comprimere una libreria condivisa x86-32 o x86-64 usare il filtro BCJ:
xz --x86 --lzma2 libfoo.so
Si noti che l'ordine delle opzioni di filtro è significativo. Se viene specificato --x86 dopo --lzma2, xz darà un errore, perché non può esserci alcun filtro dopo LZMA2 e anche perché il filtro BCJ x86 non può essere utilizzato come ultimo filtro della catena.
Il filtro Delta insieme con LZMA2 può dare buoni risultati sulle immagini bitmap. Di solito dovrebbe battere il PNG, il quale ha alcuni filtri più avanzati rispetto al semplice delta ma utilizza Deflate per la compressione effettiva.
L'immagine deve essere salvata in un formato non compresso, ad esempio un TIFF non compresso. Il parametro distanza del filtro Delta è impostato in modo che corrisponda al numero di byte per pixel nell'immagine. Per esempio, un bitmap a 24 bit richiede dist=3, e va anche bene passare pb=0 a LZMA2 per adattarsi all'allineamento a tre byte:
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
Se più immagini sono state inserite in un singolo archivio (ad esempio, .tar), il filtro Delta funzionerà anche su questo purché tutte le immagini abbiano lo stesso numero di byte per pixel.
xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)
XZ Utils: <https://xz.tukaani.org/xz-utils/>
XZ Embedded: <https://xz.tukaani.org/xz-embedded/>
LZMA SDK: <https://7-zip.org/sdk.html>
| 08/03/2025 | Tukaani |