XZ(1) | XZ Utils | XZ(1) |
NOME¶
xz, unxz, xzcat, lzma, unlzma, lzcat - Comprime o decomprime file .xz e .lzma
SINOSSI¶
xz [OPZIONE...] [FILE...]
ALIAS DEI COMANDI¶
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.
DESCRIZIONE¶
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:
- Quando si comprime, il suffisso del file destinazione (.xz or .lzma) viene accodato al nome del file sorgente per ottenere il nome del file destinazione.
- Quando si decomprime, i suffissi .xz, .lzma, o .lz vengono rimossi dal nome del file per ottenere il nome del file destinazione. xz riconosce anche i suffissi .txz e .tlz, e li sostituisce con il suffisso .tar.
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:
- FILE non è un file regolare. I collegamenti simbolici non vengono seguiti, quindi non sono considerati file regolari.
- FILE ha più di un collegamento "hard".
- FILE ha impostati i bit setuid, setgid, o sticky.
- La modalità di funzionamento è impostata sulla compressione e il FILE ha già un suffisso del formato di file di destinazione (.xz o .txz quando si comprime nel formato .xz e .lzma o .tlz quando si comprime nel formato .lzma).
- La modalità di funzionamento è impostata sulla decompressione e il FILE non ha un suffisso di nessuno dei formati di file supportati (.xz, .txz, .lzma, .tlz, o .lz).
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.
Utilizzo memoria¶
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.
Concatenazione e padding con file .xz¶
È 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.
OPZIONI¶
Suffissi interi e valori speciali¶
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.
- KiB
- Moltiplica l'intero per 1024 (2^10). Ki, k, kB, K, e KB sono accettati come sinonimi di KiB.
- MiB
- Moltiplica l'intero per 1.048.576 (2^20). Mi, m, M, e MB sono accettati come sinonimi di MiB.
- GiB
- Moltiplica l'intero per 1.073.741.824 (2^30). Gi, g, G, e GB sono accettati come sinonimi di GiB.
Il valore speciale max può essere utilizzato per indicare il valore intero massimo supportato dall'opzione.
Modalità operativa¶
Se vengono fornite più opzioni di modalità operativa, l'ultima ha effetto.
- -z, --compress
- Compressione. Questa è la modalità operativa predefinita quando non viene specificata alcuna opzione della modalità operativa e non è determinata nessun'altra modalità operativa dal nome del comando (ad esempio, unxz implica --decompress).
- Dopo che la compressione è terminata con successo, il file origine viene rimosso a meno che si stia scrivendo su standard output o che venga specificato --keep.
- -d, --decompress, --uncompress
- Decompressione. Dopo che la decompressione è terminata con successo, il file origine viene rimosso a meno che si stia scrivendo su standard output o che venga specificato --keep.
- -t, --test
- Testa l'integrità dei FILE compressi. Questa opzione è equivalente a --decompress --stdout tranne per il fatto che i dati decompressi vengono scartati invece di essere scritti nello standard output. Nessun file viene creato o rimosso.
- -l, --list
- Stampa le informazioni sul FILE compresso. Non viene prodotto alcun output non compresso e non viene creato o rimosso alcun file. In modalità elenco, il programma non è in grado di leggere i dati compressi dallo standard input o da altre fonti che non permettano la ricerca.
- Il tracciato predefinito mostra le informazioni di base sui FILE, un file per riga. Per ottenere informazioni più dettagliate, usare anche l'opzione --verbose. Per avere ancora più informazioni, usare --verbose due volte, ma si noti che questo può essere lento, perché ottenere tutte le informazioni extra richiede molte estrazioni. La larghezza dell'output dettagliato supera gli 80 caratteri, quindi il reindirizzamento dell'output, ad esempio, a less -S può essere utile se il terminale non è sufficientemente ampio.
- L'output esatto può variare tra le versioni di xz e le diverse impostazioni locali. Per un output leggibile dalla macchina si dovrebbe utilizzare --robot --list.
Modificatori dell'operazione¶
- -k, --keep
- Non elimina i file input.
- A partire da xz 5.2.6, questa opzione fa sì che xz comprima o decomprima anche se l'input è un collegamento simbolico a un file regolare, ha più di un collegamento fisico o ha il bit setuid, setgid o sticky impostato. I bit setuid, setgid e sticky non vengono copiati nel file di destinazione. Nelle versioni precedenti questo veniva fatto solo con --force.
- -f, --force
- Questa opzione ha diverse conseguenze:
- Se il file di destinazione esiste già, lo elimina prima di comprimere o decomprimere.
- Comprime o decomprime anche se l'input è un collegamento simbolico a un file regolare, ha più di un collegamento "hard", o ha il bit setuid, setgid o sticky impostato. I bit setuid, setgid e sticky non sono copiati sul file destinazione.
- Quando usato con --decompress --stdout e xz non riesce a riconoscere il tipo di file sorgente, copia il file sorgente così com'è sullo standard output. Questo permette a xzcat --force di essere usato come cat(1) per file che non siano stati compressi con xz. Si noti che in futuro xz potrebbe supportare nuovi formati di file compressi, il che potrebbe portare xz a decomprimere più tipi di file anziché copiarli come sono sullo standard output. --format=FORMATO può essere usato per forzare xz a decomprimere solo un singolo formato di file.
- -c, --stdout, --to-stdout
- Scrive i dati compressi o decompressi nello standard output anziché in un file. Implica --keep.
- --single-stream
- Decomprime solo il primo flusso .xz, e ignora automaticamente i possibili dati di input rimanenti che seguono il flusso. Normalmente questi dati sporchi finali portano xz a visualizzare un errore.
- xz non decomprime mai più di un flusso dai file .lzma o dai flussi grezzi, ma questa opzione fa comunque in modo che xz ignori i possibili dati finali dopo il file .lzma o il flusso grezzo.
- Questa opzione non ha effetto se la modalità operativa non è --decompress o --test.
- Dalla versione xz 5.7.1alpha, --single-stream implica --keep.
- --no-sparse
- Disabilita la creazione di file sparsi. Per impostazione predefinita, se si esegue la decompressione in un file regolare, xz tenta di rendere il file sparso se i dati decompressi contengono lunghe sequenze di zeri binari. Funziona anche quando si scrive su standard output, purché lo standard output sia collegato a un file regolare e siano soddisfatte alcune condizioni aggiuntive per renderlo sicuro. La creazione di file sparsi può risparmiare spazio su disco e velocizzare la decompressione riducendo la quantità di I/O su disco.
- -S .SUFFISSO, --suffix=.SUFFISSO
- Durante la compressione, utilizzare .suf come suffisso per il file di destinazione anziché .xz o .lzma. Se non si scrive nello standard output e il file di origine ha già il suffisso .suf, viene visualizzato un avvertimento e il file viene ignorato.
- Quando si decomprime, accetta i file con suffisso .suf in aggiunta a quelli con suffisso .xz, .txz, .lzma, .tlz, o .lz. Se il file sorgente ha suffisso .suf, il suffisso viene rimosso per ottenere il nome del file destinazione.
- Quando si comprimono o decomprimono flussi grezzi (--format=raw), il suffisso deve sempre essere specificato, a meno che si scriva sullo standard output, perché non esiste un suffisso predefinito per i flussi grezzi.
- --files[=FILE]
- Legge i nomi dei file da processare da FILE; se FILE è omesso, i nomi dei file vengono letti dallo standard input. I nomi dei file devono essere terminati da un carattere "a capo". Un trattino (-) è considerato come un nome di file regolare; non indica lo standard input. Se vengono forniti anche dei nomi di file come argomenti della riga di comando, questi sono processati prima di quelli letti da FILE.
- --files0[=FILE]
- Questo è identico a --files[=FILE] tranne per il fatto che ogni nome di file deve terminare con il carattere null.
Formato file di base e opzioni di compressione¶
- -F FORMATO, --format=FORMATO
- Specifica il FORMATO del file da comprimere o decomprimere:
- auto
- Questa è l'impostazione predefinita. Quando si comprime, auto è equivalente a xz. Quando si decomprime, il formato del file input viene rilevato automaticamente. Si noti che per i flussi grezzi (creati con --format=raw) non è possibile il rilevamento automatico.
- xz
- Comprime nel formato di file .xz, oppure accetta solo file .xz durante la decompressione.
- lzma, alone
- Comprime nel formato tradizionale .lzma, oppure accetta solo file .lzma per la decompressione. Il nome alternativo alone è fornito per retrocompatibilità con le LZMA Utils.
- lzip
- Accetta solo file .lz per la decompressione. La compressione non è supportata.
- Sono supportati il formato .lz versione 0 e la versione 1 non estesa. I file della versione 0 sono stati prodotti da lzip 1.3 e precedenti. Tali file non sono comuni, ma possono essere trovati negli archivi di file poiché alcuni pacchetti sorgente sono stati rilasciati in questo formato. Anche alcune persone potrebbero avere vecchi file personali in questo formato. Il supporto alla decompressione per il formato versione 0 è stato rimosso in lzip 1.18.
- lzip 1.4 e successivi creano file nel formato v1. L'estensione del marcatore di scaricamento sincronizzazione al formato v1 è stata aggiunta in lzip 1.6. Questa estensione è utilizzata raramente e non è supportata da xz(viene segnalata come input corrotto).
- raw
- Comprime o decomprime un flusso grezzo (senza intestazione). Questo è inteso solamente per utenti avanzati. Per decodificare flussi grezzi, occorre usare --format=raw e specificare esplicitamente la catena dei filtri, che normalmente sarebbero conservati nell'intestazione.
- -C CONTROLLO, --check=CONTROLLO
- Specifica il tipo di controllo di integrità. Il controllo viene calcolato dai dati non compressi e memorizzato nel file .xz. Questa opzione ha effetto solo quando si comprime nel formato .xz; il formato .lzma non supporta i controlli di integrità. Il controllo di integrità (se presente) viene verificato quando il file .xz viene decompresso.
- Tipi di CONTROLLI supportati:
- none
- Non calcola proprio il controllo di integrità. Questo in genere è una pessima idea. Può essere utile quando l'integrità dei dati viene comunque verificata con altri mezzi.
- crc32
- Calcola la firma CRC32 usando il polinomio di IEEE-802.3 (Ethernet).
- crc64
- Calcola la firma CRC64 usando il polinomio di ECMA-182. Questa è l'impostazione predefinita, perché è leggermente migliore della CRC32 nel rilevare i file danneggiati e la differenza di velocità è trascurabile.
- sha256
- Calcola la firma SHA-256. Questo è un po' più lento che CRC32 e CRC64.
- L'integrità delle intestazioni .xz viene sempre verificata con CRC32. Non è possibile modificarlo o disabilitarlo.
- --ignore-check
- Non verifica il controllo di integrità dei dati compressi durante la decompressione. Il valore CRC3 nelle intestazioni .xz sarà ancora verificata normalmente.
- Non usare questa opzione se non si è consci di cosa si sta facendo. Possibili ragioni per utilizzare questa opzione:
- Tentativo di recupero dei dati da un file .xz corrotto.
- Accelerazione della decompressione. Questo è importante soprattutto con SHA-256 o con i file che sono stati compressi molto bene. Si consiglia di non utilizzare questa opzione per questo scopo, a meno che l'integrità del file non venga verificata esternamente in altro modo.
- -0 ... -9
- Selezionare un livello di compressione preimpostato. Il valore predefinito è -6. Se vengono specificati più livelli preimpostati, l'ultimo ha effetto. Se è già stata specificata una catena di filtri personalizzata, l'impostazione di un livelli preimpostati cancella la catena di filtri personalizzata.
- Le differenze tra i livelli preimpostati sono più significative rispetto a gzip(1) e bzip2(1). Le impostazioni di compressione selezionate determinano i requisiti di memoria del decompressore, quindi l'utilizzo di un livello preimpostato troppo alto potrebbe rendere difficile la decompressione del file su un vecchio sistema con poca RAM. Specificamente, non è una buona idea utilizzare ciecamente -9 per tutto come spesso accade per gzip(1) e bzip2(1).
- -0 ... -3
- Questi sono livelli preimpostati piuttosto veloci. -0- a volte è più veloce di gzip -9 e comprime molto meglio. Quelli più alti hanno spesso una velocità paragonabile a bzip2(1) con un rapporto di compressione comparabile o migliore, anche se i risultati dipendono molto dal tipo di dati che vengono compressi.
- -4 ... -6
- Compressione da buona a molto buona, mantenendo l'utilizzo della memoria del decompressore ragionevole anche per vecchi sistemi. -6 è il valore predefinito, che di solito è una buona scelta per distribuire file che debbano essere decompressi anche su sistemi con solo 16 MiB di RAM. (Potrebbe valere la pena di considerare anche -5e o -6e. Si veda --extreme.)
- -7 ... -9
- Questi sono come -6 ma con requisiti di memoria di compressore e decompressore più elevati. Sono utili solo quando si comprimono file di dimensioni superiori a 8 MiB, 16 MiB e 32 MiB, rispettivamente.
- A parità di hardware, la velocità di decompressione è approssimativamente un numero costante di byte di dati compressi al secondo. In altre parole, migliore è la compressione, più veloce sarà di solito la decompressione. Ciò significa anche che la quantità di output non compresso prodotta al secondo può variare notevolmente.
- La tabella seguente riassume le caratteristiche dei livelli preimpostati:
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 |
- Descrizioni delle colonne:
- DictSize è la dimensione del dizionario LZMA2. È uno spreco di memoria usare un dizionario più grande della dimensione del file non compresso. Ecco perché è una buona cosa evitare di usare i livelli preimpostati -7 ... -9 quando non c'è reale necessità. Con -6 e inferiori, la quantità di memoria sprecata in genere è sufficientemente bassa da essere trascurabile.
- CompCPU è una rappresentazione semplificata delle impostazioni di LZMA2 che influenzano la velocità di compressione. Anche la dimensione del dizionario influenza la velocità, quindi mentre CompCPU è lo stesso per i livelli -6 ... -9, i livelli più alti tendono ancora ad essere un po' più lenti. Per avere una compressione ancora più lenta e quindi potenzialmente migliore, utilizzare --extreme.
- CompMem contiene i requisiti di memoria del compressore in modalità a singola thread. Può variare leggermente tra le versioni di xz.
- DecMem contiene i requisiti di memoria del decompressore. In altre parole, le impostazioni di compressione determinano i requisiti di memoria del decompressore. L'utilizzo esatto della memoria del decompressore è leggermente superiore alla dimensione del dizionario LZMA2, ma i valori nella tabella sono stati arrotondati per eccesso al successivo MiB completo.
- I requisiti di memoria per la modalità a thread multiple sono significativamente più alti che per la modalità thread singola. Con il valore predefinito di --block-size, ogni thread richiede 3*3*dimensione del dizionario più CompMem oppure DecMem. Ad esempio, 4 thread con il livello preimpostato -6 hanno bisogno di 660–670 MiB di memoria.
- -e, --extreme
- Utilizzare una variante più lenta del livello preimpostato selezionato (-0 ... -9) nella speranza di ottenere un rapporto di compressione leggermente migliore, ma con un po' di sfortuna questo potrebbe anche renderlo peggiore. L'utilizzo della memoria del decompressore non è influenzato, ma l'utilizzo della memoria del compressore aumenta leggermente ai livelli preimpostati -0 ... -3.
- Dal momento che ci sono due livelli preimpostati con dimensione del dizionario di 4 MiB e 8 MiB, i livelli preimpostati -3e e -5e usano impostazioni leggermente più veloci (minore CompCPU) di -4e e -6e, rispettivamente. In questo modo non ci sono due livelli preimpostati identici.
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 |
- Ad esempio, ci sono un totale di quattro livelli preimpostati che utilizzano un dizionario da 8 MiB, il cui ordine dal più veloce al più lento è -5, -6, -5e, e -6e.
- --fast
- --best
- Questi sono alias in qualche modo fuorvianti per -0 e -9, rispettivamente. Sono forniti solo per retrocompatibilità con le LZMA Utils. Evitare di utilizzare queste opzioni.
- --block-size=DIMENSIONE
- Quando si comprime in formato .xz, divide i dati input in blocchi da DIMENSIONE byte. I blocchi vengo compressi indipendentemente l'uno dall'altro, cosa che aiuta con le thread multiple e rende possibile la decompressione con accessi casuali limitati. Questa opzione viene usata tipicamente per sovrascrivere la dimensione predefinita dei blocchi in modalità a thread multiple, ma può essere utilizzata anche in modalità thread singola.
- In modalità a thread multiple verranno allocati circa il triplo di DIMENSIONE di byte in ogni thread per il buffering dell'input e dell'output. La DIMENSIONE predefinita è tre volte la dimensione del dizionario LZMA2 e comunque almeno 1 MiB. Tipicamente un buon valore è 2–4 volte la dimensione del dizionario LZMA2 oppure almeno 1 MiB. Usare una DIMENSIONE inferiore della dimensione del dizionario LZMA2 causa uno spreco di RAM, in quanto il buffer del dizionario LZMA2 non verrà mai riempito completamente. In modalità a thread multiple, la dimensione dei blocchi è conservata nelle intestazioni dei blocchi. L'informazione sulla dimensione è richiesta per la decompressione a thread multiple.
- Nella modalità a thread singola, per impostazione predefinita non viene eseguita alcuna suddivisione in blocchi. L'impostazione di questa opzione non influisce sull'utilizzo della memoria. Nessuna informazione sulle dimensioni viene memorizzata nelle intestazioni di blocco, quindi i file creati in modalità a thread singola non saranno identici ai file creati in modalità a thread multiple. La mancanza di informazioni sulle dimensioni significa anche che xz non sarà in grado di decomprimere i file in modalità a thread multiple.
- --block-list=ELEMENTI
- Quando si comprime nel formato .xz, inizia un nuovo blocco con una catena di filtri personalizzata dopo gli intervalli indicati di dati non compressi.
- Gli ELEMENTI sono un elenco separato da virgole. Ogni elemento è costituito da un numero di catena di filtri opzionale compreso tra 0 e 9 seguito da due punti (:) e da una dimensione richiesta di dati non compressi. L'omissione di un elemento (due o più virgole consecutive) è una scorciatoia per utilizzare le dimensioni e i filtri dell'elemento precedente.
- Se il file di input è più grande della somma delle dimensioni in ELEMENTI, l'ultimo elemento viene ripetuto fino alla fine del file. Il valore speciale 0 può essere utilizzato come ultima dimensione per indicare che il resto del file deve essere codificato come un singolo blocco.
- È possibile specificare una catena di filtri alternativa per ogni blocco in combinazione con le opzioni --filters1=FILTRI ... --filters9=FILTRI. Queste opzioni definiscono catene di filtri con un identificatore compreso tra 1–9. La catena di filtri 0 può essere utilizzata per indicare la catena di filtri predefinita, che equivale a non specificare una catena di filtri. L'identificatore della catena di filtri può essere utilizzato prima della dimensione non compressa, seguita da due punti (:). Ad esempio, se si specifica --block-list=1:2MiB,3:2MiB,2:4MiB,,2MiB,0:4MiB allora i blocchi verranno creati utilizzando:
- La catena dei filtri specificata da --filters1 e un input di 2 MiB
- La catena dei filtri specificata da --filters3 e un input di 2 MiB
- La catena dei filtri specificata da --filters2 e un input di 4 MiB
- La catena dei filtri specificata da --filters2 e un input di 4 MiB
- La catena di filtri predefinita e l'input di 2 MiB
- La catena di filtri predefinita e l'input di 4 MiB per ogni blocco fino alla fine dell'input.
- Se si specifica una dimensione che supera la dimensione del blocco del codificatore (il valore predefinito in modalità thread oppure il valore specificato con --block-size=DIMENSIONE), il codificatore creerà blocchi aggiuntivi mantenendo i limiti specificati in ELEMENTI. Ad esempio, se si indica --block-size=10MiB --block-list=5MiB,10MiB,8MiB,12MiB,24MiB e il file input è di 80 MiB, si otterranno 11 blocchi: 5, 10, 8, 10, 2, 10, 10, 4, 10, 10, and 1 MiB.
- In modalità a thread multiple, le dimensioni dei blocchi vengono memorizzate nelle intestazioni dei blocchi. Questo non avviene in modalità thread singola, quindi l'output codificato non sarà identico a quello della modalità a thread multiple.
- --flush-timeout=TIMEOUT
- Quando si comprime, se sono passati più di TIMEOUT millisecondi (un intero positivo) dallo scaricamento precedente e la lettura di ulteriori input si bloccherebbe, tutti i dati di input in sospeso vengono scaricati dal codificatore e resi disponibili nel flusso di output. Questo può essere utile se xz viene usato per comprimere dati in streaming dalla rete. Piccoli valori del TIMEOUT rendono disponibili i dati al ricevente con un ritardo minimo, mentre valori di TIMEOUT grandi danno un miglior rapporto di compressione.
- Questa funzionalità è disabilitata per impostazione predefinita. Se questa opzione viene specificata più di una volta, l'ultima ha effetto. Il valore speciale TIMEOUT di 0 può essere utilizzato per disabilitare esplicitamente questa funzionalità.
- Questa funzionalità non è disponibile sui sistemi non-POSIX.
- Questa funzionalità è sperimentale. Attualmente xz non è adatto per decomprimere il flusso in tempo reale, a causa di come effettua il buffering.
- --no-sync
- Non sincronizzare il file target e la sua directory sull'unità di archiviazione prima di rimuovere il file sorgente. Questo può migliorare le performance se si sta comprimendo o decomprimendo tanti piccoli file. Tuttavia, se il sistema dovesse andare in crash subito dopo l'eliminazione, è possibile che il file destinazione non sia ancora stato scritto sull'unità di archiviazione mentre l'operazione di eliminazione sì. In questo caso non saranno più disponibili né il file sorgente originale né il file di destinazione.
- Questa opzione ha effetto solamente quando xz deve rimuovere il file sorgente. Negli altri casi la sincronizzazione non viene eseguita.
- La sincronizzazione e --no-sync sono stati aggiunti nella versione xz 5.7.1alpha.
- --memlimit-compress=LIMITE
- Imposta un limite di utilizzo della memoria per la compressione. Se questa opzione viene specificata più volte, ha effetto l'ultima.
- Se le impostazioni di compressione superano il valore LIMITE, xz tenterà di regolare le impostazioni verso il basso in modo che il limite non venga più superato e visualizzerà un avviso che indica che è stata eseguita una regolazione automatica. Le regolazioni vengono eseguite in questo ordine: riduzione del numero di thread, passaggio alla modalità a thread singola se anche un solo thread in modalità a thread multiple supera il LIMITE, e infine riducendo la dimensione del dizionario LZMA2.
- Quando si comprime con --format=raw oppure se si è specificato --no-adjust, è possibile ridurre solo il numero di thread, poiché questo può essere fatto senza influire sull'output compresso.
- Se non è possibile soddisfare il LIMITE anche con le regolazioni sopra descritte, viene visualizzato un errore e xz uscirà con lo stato di uscita 1.
- Il LIMITE può essere specificato in diversi modi:
- Il LIMITE può essere un valore assoluto in byte. Usare un suffisso intero come MiB può essere utile. Ad esempio: --memlimit-compress=80MiB
- Il LIMITE può essere specificato come percentuale della memoria fisica (RAM) totale. Questo può essere utile specialmente quando si imposta la variabile di ambiente XZ_DEFAULTS in uno script di inizializzazione di shell che è condiviso tra computer diversi. In questo modo il limite è automaticamente più grande sui sistemi con più memoria. Ad esempio: --memlimit-compress=70%
- Il LIMITE può essere reimpostato al suo valore predefinito impostandolo a 0.Questo attualmente equivale a impostare il LIMITE a max (nessun limite nell'utilizzo di memoria).
- Per xz a 32-bit esiste un caso particolare: se il LIMITE fosse oltre 4020 MiB, il LIMITE viene impostato a 4020 MiB. Su MIPS32 invece viene usato 2000 MiB. (I valori 0 e max non sono influenzati da questo. Un comportamento simile non esiste per la decompressione). Questo può essere utile quando un eseguibile a 32 bit ha accesso a uno spazio di indirizzi da 4 GiB (2 GiB su MIPS32), e si spera che non faccia danni in altre situazioni.
- Vedere anche la sezione Utilizzo memoria
- --memlimit-decompress=LIMITE
- Imposta un limite di utilizzo della memoria per la decompressione. Questo influisce anche sulla modalità --list. Se l'operazione non è possibile senza oltrepassare il LIMITE, xz mostrerà un errore e la decompressione del file fallirà. Si veda --memlimit-compress=LIMITE per possibili modi per specificare il LIMITE.
- --memlimit-mt-decompress=LIMITE
- Imposta un limite di utilizzo della memoria per la decompressione multi-thread. Questo può influire solo sul numero di thread; non indurrà mai xz a rifiutarsi di decomprimere un file. Se LIMITE è troppo basso per consentire le thread multiple, il LIMITE viene ignorato e xz continuerà in modalità a thread singola. Si noti che se viene utilizzato anche --memlimit-decompress, si applicherà sempre sia alla modalità a thread singola che a quella a thread multiple, e quindi il LIMITE effettivo per le thread multiple non sarà mai superiore a quello impostato con --memlimit-decompress.
- In contrasto con le altre opzioni di limite di utilizzo della memoria, --memlimit-mt-decompress=LIMITE ha un LIMITE predefinito specifico per il sistema. xz --info-memory può essere utilizzato per vedere il valore corrente.
- Questa opzione e il suo valore predefinito esistono perché, senza un limite, il decompressore a thread multiple potrebbe finire per allocare una quantità folle di memoria per alcuni file input. Se il valore predefinito LIMITE è troppo basso sul proprio sistema, è possibile aumentarlo liberamente, ma non deve essere mai impostato a un valore più grande della quantità di RAM utilizzabile, in quanto con file di input appropriati xz cercherà di utilizzare quella quantità di memoria anche con un basso numero di thread. Esaurire la memoria o fare swap non migliorerà le performance della decompressione.
- Vedi --memlimit-compress=LIMITE per possibili modi per specificare il LIMITE. Impostando LIMITE su 0 si ripristina il valore predefinito LIMITE specifico del sistema.
- -M LIMITE, --memlimit=LIMITE, --memory=LIMITE
- Questo equivale a specificare --memlimit-compress=LIMITE --memlimit-decompress=LIMITE --memlimit-mt-decompress=LIMITE.
- --no-adjust
- Visualizza un errore e esce se non è possibile soddisfare il limite di utilizzo della memoria senza regolare le impostazioni che influiscono sull'output compresso. In altre parole, ciò impedisce a xz di passare il codificatore dalla modalità multi-thread alla modalità a thread singola e di ridurre le dimensioni del dizionario LZMA2. Anche quando viene usata questa opzione, il numero di thread può essere ridotto per soddisfare il limite di utilizzo della memoria, in quanto ciò non influirà sull'output compresso.
- La regolazione automatica è sempre disabilitata quando si creano flussi raw (--format=raw).
- -T THREADS, --threads=THREADS
- Specifica il numero di thread di lavoro da utilizzare. L'impostazione di THREADS al valore speciale 0 fa sì che xz utilizzi fino a un numero di thread che il processore/i del sistema supportano. Il numero effettivo di thread può essere inferiore a THREADS se il file di input non è sufficientemente grande per il threading con le impostazioni specificate o se l'utilizzo di più thread supera il limite di utilizzo della memoria.
- I compressori a thread singola e a thread multiple producono output diversi. Il compressore a thread singola produrrà la dimensione del file più piccola, ma solo l'output del compressore a thread multiple può essere decompresso utilizzando più thread. Impostando THREADS su 1 verrà utilizzata la modalità a thread singola. L'impostazione di THREADS su qualsiasi altro valore, incluso 0, utilizzerà il compressore a thread multiple anche se il sistema supporta un solo thread hardware. (xz 5.2.x utilizzava la modalità a thread singola in questa situazione.)
- Per utilizzare la modalità a thread multiple con un solo thread, impostare THREADS su +1. Il prefisso + non ha alcun effetto con valori diversi da 1. Un limite di utilizzo della memoria può comunque far passare xz alla modalità a thread singola a meno che non venga utilizzato --no-adjust. Il supporto per il prefisso + è stato aggiunto in xz 5.4.0.
- Se è stato richiesto un numero automatico di thread e non è stato specificato alcun limite di utilizzo della memoria, verrà utilizzato un limite "soft" predefinito, specifico del sistema, per limitare eventualmente il numero di thread. È un limite "soft" nel senso che viene ignorato se il numero di thread diventa uno, quindi un limite soft non impedirà mai a xz di comprimere o decomprimere. Questo limite soft predefinito non farà passare xz dalla modalità a thread multiple alla modalità thread singola. I limiti attivi possono essere visualizzati con xz --info-memory.
- Attualmente l'unico metodo di threading consiste nel dividere l'input in blocchi e comprimerli indipendentemente l'uno dall'altro. La dimensione predefinita del blocco dipende dal livello di compressione e può essere sovrascritta con l'opzione --block-size=DIMENSIONE.
- La decompressione a thread multiple funziona solo su file che contengano più blocchi con l'informazione della dimensione nelle intestazioni del blocco. Tutti i file sufficientemente grandi compressi in modalità a thread multiple soddisfano questa condizione, mentre i file compressi in modalità thread singola no, neanche se si è utilizzato --block-size= DIMENSIONE.
- Il valore predefinito per THREADS è 0. In xz 5.4.x e precedenti il valore predefinito era 1.
Catene di filtri di compressione personalizzate¶
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.
- --filters=FILTRI
- Specifica l'intera catena dei filtri oppure un livello preimpostato in una singola opzione. Ogni filtro può essere separato da spazi o da due trattini (--). Potrebbe essere necessario mettere tra virgolette i FILTRI sulla riga di comando della shell in modo che vengano analizzati come una singola opzione. Per indicare OPZIONI, usa : o =. Un livello preimpostato può essere preceduto da un - e seguito da zero o più flag. L'unico flag supportato è e per applicare le stesse opzioni di --extreme.
- --filters1=FILTRI ... --filters9=FILTRI
- Specifica fino a nove catene di filtri aggiuntive che possono essere utilizzate con --block-list.
- Ad esempio, quando si comprime un archivio con file eseguibili seguiti da file di testo, la parte eseguibile potrebbe utilizzare una catena di filtri con un filtro BCJ e la parte di testo solo il filtro LZMA2.
- --filters-help
- Mostra un messaggio di aiuto che descrive come specificare livelli preimpostati e catene di filtri personalizzati nelle opzioni --filters e --filters1=FILTRI ... --filters9=FILTRI, e termina con successo.
- --lzma1[=OPZIONI]
- --lzma2[=OPZIONI]
- Aggiunge un filtro LZMA1 o LZMA2 alla catena dei filtri. Questi filtri possono essere usati solo come ultimo filtro della catena.
- LZMA1 è un filtro obsoleto, supportato quasi esclusivamente a causa del formato obsoleto di file .lzma, che supporta solo LZMA1. LZMA2 è una versione aggiornata di LZMA1 che risolve alcuni problemi pratici di LZMA1. Il formato .xz utilizza LZMA2 e non supporta LZMA1. La velocità e i rapporti di compressione di LZMA1 e LZMA2 sono praticamente gli stessi.
- LZMA1 e LZMA2 condividono lo stesso insieme di OPZIONI:
- preset=PRESET
- Reimposta tutte le OPZIONI LZMA1 o LZMA2 a PRESET. Il PRESET (livello preimpostato) consiste di un numero intero, che può essere seguito da modificatori costituiti da una singola lettera. Il numero intero può andare da 0 a 9, corrispondenti alle opzioni della riga di comando -0 ... -9. L'unico modificatore attualmente supportato è e, che corrisponde a --extreme. Se non viene specificato alcun PRESET, i valori predefiniti delle OPZIONI LZMA1 o LZMA2 sono presi dal livello preimpostato 6.
- dict=DIMENSIONE
- La DIMENSIONEdel dizionario (buffer di cronologia) indica quanti byte dei dati non compressi elaborati di recente vengono mantenuti in memoria. L'algoritmo tenta di trovare sequenze di byte ripetute (corrispondenze) nei dati non compressi e di sostituirle con riferimenti ai dati attualmente presenti nel dizionario. Più grande è il dizionario, maggiore è la possibilità di trovare una corrispondenza. Quindi, l'aumento della DIMENSIONE del dizionario di solito migliora il rapporto di compressione, ma un dizionario più grande del file non compresso è uno spreco di memoria.
- Una DIMENSIONE tipica per un dizionario è da 64 KiB a 64 MiB. Il minimo è 4 KiB. Il massimo per la compressione è attualmente 1.5 GiB (1536 MiB). La decompressione supporta già dizionari fino a 4 GiB meno 1 byte, che è il massimo per i formati di flusso LZMA1 e LZMA2.
- La DIMENSIONE del dizionario e il cercatore di corrispondenze (CERCATORE) insieme determinano l'utilizzo della memoria del codificatore LZMA1 o LZMA2. Per la decompressione è necessaria la stessa DIMENSIONE del dizionario utilizzata durante la compressione (o più grande), quindi l'utilizzo della memoria del decodificatore è determinato dalla dimensione del dizionario utilizzato durante la compressione. Le intestazioni .xz memorizzano la DIMENSIONE del dizionario come 2^n o 2^n + 2^( n-1), quindi queste DIMENSIONI sono in qualche modo preferite per la compressione. Altre DIMENSIONI verranno arrotondate per eccesso quando memorizzate nelle intestazioni .xz.
- lc=lc
- Specificare il numero di bit di contesto letterali. Il minimo è 0 e il massimo è 4; Il valore predefinito è 3. Inoltre, la somma di lc e lp non deve superare 4.
- Tutti i byte che non possono essere codificati come corrispondenze vengono codificati come valori letterali. In altre parole, i valori letterali sono semplicemente byte a 8 bit codificati uno alla volta.
- La codifica letterale presuppone che i bit di lc più alti del byte non compresso precedente siano correlati al byte successivo. Ad esempio, in un tipico testo inglese, una lettera maiuscola è spesso seguita da una lettera minuscola e una lettera minuscola è solitamente seguita da un'altra lettera minuscola. Nel set di caratteri US-ASCII, i tre bit più alti sono 010 per le lettere maiuscole e 011 per le lettere minuscole. Quando lc è almeno 3, la codifica letterale può sfruttare questa proprietà nei dati non compressi.
- Il valore predefinito (3) solitamente è buono. Se si desidera la compressione massima, provare con lc=4. A volte aiuta un po', e a volte rende la compressione peggiore. Se la rende peggiore, provare anche lc=2.
- lp=lp
- Specificare il numero di bit di posizione letterale. Il minimo è 0 e il massimo è 4; Il valore predefinito è 0.
- Il parametro lp influisce sul tipo di allineamento nei dati non compressi presunto durante la codifica dei valori letterali. Vedi pb di seguito per ulteriori informazioni sull'allineamento.
- pb=pb
- Specificare il numero di bit di posizione. Il minimo è 0 e il massimo è 4; Il valore predefinito è 2.
- Il parametro pb influisce su quale tipo di allineamento nei dati non compressi sia assunto in generale. L'impostazione predefinita indica un allineamento a quattro byte (2^pb =2^2=4), che è spesso una buona scelta se non c'è un'ipotesi migliore.
- Quando l'allineamento è noto, impostare pb concordemente può ridurre un po' le dimensioni del file. Ad esempio, con file di testo con 1 byte di allineamento (US-ASCII, ISO-8859-*, UTF-8), impostare pb=0 può migliorare leggermente la compressione. Per il testo UTF-16, pb=1 è una buona scelta. Se l'allineamento è un numero dispari, come 3 byte, pb=0 potrebbe essere la scelta migliore.
- Anche se l'allineamento assunto può essere regolato con pb e lp, LZMA1 e LZMA2 favoriscono ancora leggermente l'allineamento a 16 byte. Potrebbe valere la pena tenerlo in considerazione quando si progettano formati di file che possono essere spesso compressi con LZMA1 o LZMA2.
- mf=CERCATORE
- Il cercatore di corrispondenze ha un effetto importante sulla velocità del codificatore, sull'utilizzo della memoria e sul rapporto di compressione. Di solito i cercatori di corrispondenze a catena hash sono più veloci dei cercatori di corrispondenze ad albero binario. Il valore predefinito dipende da PRESET : 0 usa hc3, 1–3 usa hc4 e il resto usa bt4.
- Sono supportati i seguenti cercatori di corrispondenze. Le formule di utilizzo della memoria riportate di seguito sono approssimazioni, che sono le più vicine alla realtà quando DIZIONARIO è una potenza di due.
- hc3
- Catena hash con hashing da 2 e 3 byte
Minimo valore per NICE: 3
Utilizzo memoria:
DIZIONARIO * 7.5 (se DIZIONARIO <= 16 MiB);
DIZIONARIO * 5.5 + 64 MiB (se DIZIONARIO > 16 MiB) - hc4
- Catena hash con hash da 2, 3 e 4 byte
Minimo valore per NICE: 4
Utilizzo memoria:
DIZIONARIO * 7.5 (se DIZIONARIO <= 32 MiB);
DIZIONARIO * 6.5 (se DIZIONARIO > 32 MiB) - bt2
- Albero binario con hashing da 2 byte
Valore minimo per NICE: 2
Utilizzo di memoria: DIZIONARIO * 9.5 - bt3
- Albero binario con hashing da 2 e 3 byte
Minimo valore per NICE: 3
Utilizzo memoria:
DIZIONARIO * 11.5 (se DIZIONARIO <= 16 MiB);
DIZIONARIO * 9.5 + 64 MiB (se DIZIONARIO > 16 MiB) - bt4
- Albero binario con hashing da 2, 3 e 4 byte
Minimo valore per NICE: 4
Utilizzo memoria:
DIZIONARIO * 11.5 (se DIZIONARIO <= 32 MiB);
DIZIONARIO * 10.5 (se DIZIONARIO > 32 MiB)
- mode=MODALITÀ
- La MODALITÀ di compressione specifica il metodo per analizzare i dati prodotti dal cercatore di corrispondenze. Le MODALITÀ supportate sono fast e normal. Il predefinito è fast per i PRESET 0–3 e normal per i PRESET 4–9.
- Di solito fast viene utilizzato con i cercatori di corrispondenze a catena hash e normal con i cercatori di corrispondenze a albero binario. Questo è anche quello che fanno i PRESET.
- nice=NICE
- Specifica quella che si considera una lunghezza accettabile ("nice") per una corrispondenza. Una volta trovata una corrispondenza di almeno NICE byte, l'algoritmo smette di cercare corrispondenze potenzialmente migliori.
- NICE può valere 2–273 byte. Valori più alti tendono a dare un miglior rapporto di compressione ai danni della velocità. Il valore predefinito dipende dal PRESET.
- depth=PROFONDITÀ
- Specificare la profondità di ricerca massima nel cercatore di corrispondenze. Il valore predefinito è il valore speciale 0, che dice al compressore di determinare una PROFONDITÀ ragionevole da CERCATORE e NICE.
- Una PROFONDITÀ ragionevole per le catene hash è 4–100 e 16–1000 per gli alberi binari. Utilizzando valori di PROFONDITÀ molto alti si può rendere il codificatore estremamente lento con alcuni file. Evitare di impostare la PROFONDITÀ oltre 1000 a meno che si sia preparati a interrompere la compressione nel caso in cui richieda troppo tempo.
- Quando si decomprime un flusso grezzo (--format=raw), LZMA2 ha bisogno solamente della DIMENSIONE del dizionario. LZMA1 ha anche bisogno di lc, lp, e pb.
- --x86[=OPZIONI]
- --arm[=OPZIONI]
- --armthumb[=OPZIONI]
- --arm64[=OPZIONI]
- --powerpc[=OPZIONI]
- --ia64[=OPZIONI]
- --sparc[=OPZIONI]
- --riscv[=OPZIONI]
- Aggiunge un filtro branch/call/jump (BCJ) alla catena dei filtri. Questi filtri non possono essere utilizzati come ultimo filtro nella catena di filtri.
- Un filtro BCJ converte gli indirizzi relativi in codice macchina nelle loro controparti assolute. Questo non cambia la dimensione dei dati ma aumenta la ridondanza, cosa che può aiutare LZMA2 a produrre .xz file 0–15 % più piccoli. I filtri BCJ sono sempre reversibili, quindi usare un filtro BCJ per il tipo di dati sbagliato non causa perdita di dati, al massimo può determinare un rapporto di compressione leggermente peggiore. I filtri BCJ sono molto veloci e usano una quantità di memoria minima.
- Questi filtri BCJ presentano problemi noti relativi al rapporto di compressione:
- Alcuni tipi di file contenenti codice eseguibile (ad esempio, file oggetto, librerie statiche e moduli del kernel Linux) hanno gli indirizzi nelle istruzioni riempiti con valori di riempimento. Questi filtri BCJ eseguiranno comunque la conversione degli indirizzi, il che peggiorerà la compressione con questi file.
- Se un filtro BCJ viene applicato a un archivio, è possibile che renda il rapporto di compressione peggiore rispetto a non usare un filtro BCJ. Ad esempio, se ci sono eseguibili simili o addirittura identici, il filtraggio probabilmente renderà i file meno simili e quindi la compressione sarà peggiore. Anche il contenuto dei file non eseguibili nello stesso archivio può essere importante. In pratica bisogna provare con e senza filtro BCJ per vedere quale sia il migliore in ogni situazione.
- Insiemi diversi di istruzioni hanno diversi allineamenti: il file eseguibile deve essere allineato a un multiplo di questo valore nei dati di input per far funzionare il filtro.
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 |
- Dal momento che i dati filtrati da BCJ solitamente sono compressi con LZMA2, il rapporto di compressione può essere migliorato leggermente se le opzioni LZMA2 sono impostate in modo che corrispondano all'allineamento del filtro BCJ selezionato. Esempi:
- Il filtro IA-64 ha un allineamento a 16 byte, quindi pb=4,lp=4,lc=0 è una buona scelta per LZMA2 (2^4=16).
- Il codice RISC-V ha un allineamento a 2 o 4 byte a seconda che il file contenga o meno istruzioni 16 bit compresse (cosiddetta estensione C). Quando sono usate istruzioni a 16 bit, va bene pb=2,lp=1,lc=3 o pb=1,lp=1,lc=3. Quando le istruzioni a 16 bit non sono presenti, è meglio pb=2,lp=2,lc=2. Si può usare readelf -h per controllare se "RVC" appare sulla riga del "Flag".
- ARM64 è sempre allineato a 4 byte, quindi pb=2,lp=2,lc=2 è la scelta migliore.
- Il filtro x86 è un'eccezione. Di solito è bene attenersi alle impostazioni predefinite di LZMA2 (pb=2,lp=0,lc=3) quando si comprimono gli eseguibili x86.
- Tutti i filtri BCJ supportano le stesse OPZIONI:
- start=OFFSET
- Specifica l'OFFSET iniziale utilizzato per la conversione tra indirizzi relativi e assoluti. L'OFFSET deve essere un multiplo dell'allineamento del filtro (vedere la tabella sopra). Il valore predefinito è zero. In pratica, l'impostazione predefinita è buona; specificare un OFFSET personalizzato non è quasi mai utile.
- --delta[=OPZIONI]
- Aggiunge un filtro Delta alla catena dei filtri. I filtri Delta non possono essere utilizzati come ultimo filtro nella catena di filtri.
- Al momento è supportato solo un semplice calcolo delta byte-per-byte. Può essere utile quando si comprime, per esempio, immagini bitmap non compresse o file audio PCM non compressi. Tuttavia, speciali algoritmi ad-hoc potrebbero dare risultati significativamente migliori che Delta + LZMA2. Questo è vero specialmente per l'audio, che comprime più velocemente e meglio, ad esempio, con flac(1).
- OPZIONI supportate:
- dist=DISTANZA
- Specifica la DISTANZA del calcolo delta in byte. DISTANZA deve essere nel range 1–256. Il valore predefinito è 1.
- Per esempio, con dist=2 e un input di 8 byte A1 B1 A2 B3 A3 B5 A4 B7, l'output sarà A1 B1 01 02 01 02 01 02.
Altre opzioni¶
- -q, --quiet
- Sopprime avvertimenti e avvisi. Specificarlo due volte per eliminare anche gli errori. Questa opzione non ha alcun effetto sullo stato di uscita. In altre parole, anche se un avvertimento è stato eliminato, lo stato di uscita che indica un avvertimento viene comunque utilizzato.
- -v, --verbose
- Sii prolisso. Se lo standard error è collegato a un terminale, xz visualizzerà un indicatore di avanzamento. Specificando --verbose due volte si otterrà un output ancora più dettagliato.
- L'indicatore di avanzamento mostra le seguenti informazioni:
- La percentuale di avanzamento è mostrata se la dimensione del file input è nota. Quindi, la percentuale non può essere mostrata nei pipe.
- Quantità di dati compressi prodotti (in compressione) o utilizzati (in decompressione).
- Quantità di dati non compressi consumati (in compressione) o prodotti (in decompressione).
- Rapporto di compressione, calcolato dividendo la quantità di dati compressi processati finora con la quantità di dati non compressi processati finora.
- Velocità di compressione o decompressione. Questa è misurata come la quantità di dati non compressi consumati (in compressione) o prodotti (in decompressione) al secondo. Viene mostrata dopo che è trascorso qualche secondo da quando xz ha iniziato a processare il file.
- Tempo trascorso nel formato M:SS o H:MM:SS.
- Il tempo residuo stimato è mostrato solo quando la dimensione del file in ingresso è nota e sono già passati un paio di secondi da quando xz ha iniziato a processare il file. Il tempo è mostrato in un formato meno preciso che non ha mai i due punti, ad esempio 2 min 30 s.
- Quando lo standard error non è un terminale, --verbose farà stampare a xz il nome del file, la dimensione compressa, la dimensione non compressa, il rapporto di compressione, e potendo anche la velocità e il tempo trascorso, su una singola riga dello standard error, dopo aver compresso o decompresso il file. La velocità e il tempo trascorso sono inclusi solo se l'operazione è durata almeno un paio di secondi. Se l'operazione non è conclusa, ad esempio a causa dell'interruzione da parte dell'utente, viene stampata anche la percentuale di completamento, a patto che la dimensione del file input sia nota.
- -Q, --no-warn
- Non impostare lo stato di uscita a 2 anche se è stata rilevata una condizione che merita un avvertimento. Questa opzione non influisce sul livello di dettaglio, quindi sia --quiet che --no-warn devono essere utilizzati per non visualizzare avvertimenti e per non alterare lo stato di uscita.
- --robot
- Stampa i messaggi in un formato analizzabile dal computer. Questo ha lo scopo di facilitare la scrittura dei frontend che vogliono usare xz invece di liblzma, che potrebbe essere il caso di vari script. Si intende che con questa opzione abilitata l'output dovrebbe rimanere stabile tra le versioni di xz. Per ulteriori informazioni, vedere la sezione MODALITÀ ROBOT.
- --info-memory
- Mostra, in un formato leggibile da umani, quanta memoria fisica (RAM) e quante thread xz pensa che il sistema abbia e i limiti di utilizzo di memoria per la compressione e la decompressione, quindi termina con successo.
- -h, --help
- Mostra un messaggio di aiuto che descrive le opzioni usate più comunemente, e termina con successo.
- -H, --long-help
- Mostra un messaggio di aiuto che descrive tutte le funzionalità di xz, e termina con successo
- -V, --version
- Mostra il numero di versione di xz e liblzma in un formato leggibile dagli umani. Per ottenere un output analizzabile da una macchina specificare --robot prima di --version.
MODALITÀ ROBOT¶
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.
Modalità stampa¶
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:
- name
- Questa è sempre la prima riga quando si inizia a elencare un file. La seconda colonna della riga è il nome del file.
- file
- Questa riga contiene informazioni generali sul file .xz. Questa riga viene sempre stampata dopo la riga name.
- stream
- Questo tipo di riga viene utilizzato solo quando è stato specificato --verbose. Sono presenti tante righe stream quanti sono i flussi nel file .xz.
- block
- Questo tipo di riga viene utilizzato solo quando è stato specificato --verbose. Ci sono tante righe block quanti sono i blocchi nel file .xz. Le righe block vengono visualizzate dopo tutte le righe stream; i diversi tipi di riga non vengono interlacciati.
- summary
- Questo tipo di riga viene utilizzato solo quando --verbose è stato specificato due volte. Questa riga viene stampata dopo tutte le righe block. Come la riga file, la riga summary contiene informazioni generali sul file .xz.
- totals
- Questa riga è sempre l'ultima riga dell'output dell'elenco. Mostra i conteggi totali e le dimensioni.
Le colonne delle righe file:
- 2.
- Numero di flussi nel file
- 3.
- Numero totale di blocchi nel flusso/i.
- 4.
- Dimensione compressa del file
- 5.
- Dimensione non compressa del file
- 6.
- Rapporto di compressione, es. 0.123. Se il rapporto è oltre 9999, al posto del rapporto vengono mostrati tre trattini (---).
- 7.
- Elenco separato da virgole dei nomi dei controlli di integrità. Le stringhe seguenti vengono utilizzate per i tipi di controllo conosciuti: None, CRC32, CRC64, e SHA-256. Per i tipi di controllo non conosciuti viene utilizzato Unknown-N, dove N è l'ID del controllo come numero decimale (una o due cifre).
- 8.
- Dimensione totale del padding del flusso nel file
Le colonne delle righe stream:
- 2.
- Numero di flusso (il primo è 1)
- 3.
- Numero di blocchi nel flusso
- 4.
- Offset iniziale compressione
- 5.
- Offset iniziale decompressione
- 6.
- Dimensione compressa (non include il padding del flusso)
- 7.
- Dimensione non compressa
- 8.
- Rapporto di compressione
- 9.
- Nome del controllo di integrità
- 10.
- Dimensione del padding del flusso
Le colonne delle righe block:
- 2.
- Numero di flussi che contengono questo blocco
- 3.
- Numero del blocco relativo all'inizio del flusso (il primo blocco è 1)
- 4.
- Numero del blocco relativo all'inizio del file
- 5.
- Offset iniziale compressione relativo all'inizio del file
- 6.
- Offset iniziale decompressione relativo all'inizio del file
- 7.
- Dimensione totale compressa del blocco (incluse le intestazioni)
- 8.
- Dimensione non compressa
- 9.
- Rapporto di compressione
- 10.
- Nome del controllo di integrità
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:
- 11.
- Valore del controllo di integrità in formato esadecimale
- 12.
- Dimensione intestazione blocco
- 13.
- Flag del blocco: cindica che è presente la dimensione compressa, u indica che è presente la dimensione non compressa. Se il flag non è impostato, viene mostrato un trattino (-) per mantenere fissa la lunghezza della stringa. Nuovi flag potrebbero essere aggiunti alla fine della stringa in futuro.
- 14.
- Dimensione dei dati compressi effettivi nel blocco (sono esclusi l'intestazione del blocco, il padding del blocco e i campi di controllo)
- 15.
- Quantità di memoria (in byte) necessaria per decomprimere questo blocco con questa versione xz
- 16.
- Catena di filtri. Si noti che la maggior parte delle opzioni utilizzate al momento della compressione non è nota, perché solo le opzioni necessarie per la decompressione sono memorizzate nelle intestazioni .xz.
Le colonne delle righe summary:
- 2.
- Quantità di memoria (in byte) necessaria per decomprimere questo file con questa versione xz
- 3.
- yes o no indica se tutte le intestazioni di blocco contengono all'interno sia dimensioni compresse che dimensioni non compresse
A partire da xz 5.1.2alpha:
- 4.
- Versione minima di xz richiesta per decomprimere il file
Le colonne delle righe totali:
- 2.
- Numero di flussi
- 3.
- Numero di blocchi
- 4.
- Dimensione compressa
- 5.
- Dimensione non compressa
- 6.
- Rapporto di compressione medio
- 7.
- Elenco separato da virgole dei nomi dei controlli di integrità presenti nei file
- 8.
- Dimensione del padding dello stream
- 9.
- Numero di file. Questo serve a mantenere l'ordine delle colonne precedenti uguale a quello delle righe del file.
Se --verbose viene specificato due volte, sono incluse colonne aggiuntive nella riga totali:
- 10.
- Quantità massima di memoria (in byte) necessaria per decomprimere i file con questa versione xz
- 11.
- yes o no indica se tutte le intestazioni di blocco contengono all'interno sia dimensioni compresse che dimensioni non compresse
A partire da xz 5.1.2alpha:
- 12.
- Versione minima di xz richiesta per decomprimere il file
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.
Aiuto sui filtri¶
xz --robot --filters-help stampa i filtri supportati nel seguente formato:
FILTRO:OPZIONE=<VALORE>,OPZIONE=<VALORE>...
- FILTRO
- Nome del filtro
- OPZIONE
- Nome di un'opzione specifica del filtro
- VALORE
- Gli intervalli del VALORE numerico appaiono come <MIN-MAX>. Le scelte per i VALORI stringa sono mostrati in < > e separati dal carattere |.
Ogni filtro è mostrato su una riga dedicata.
Informazione limite memoria¶
xz --robot --info-memory stampa una singola riga con più colonne separate da tabulazione:
- 1.
- Quantità totale di memoria fisica (RAM) in byte.
- 2.
- Limite utilizzo memoria per la compressione in byte (--memlimit-compress). Il valore speciale 0 indica l'impostazione predefinita, che in modalità thread singola equivale a nessun limite.
- 3.
- Limite utilizzo memoria per la decompressione in byte (--memlimit-decompress). Il valore speciale 0 indica l'impostazione predefinita, che in modalità thread singola equivale a nessun limite.
- 4.
- A partire da xz 5.3.4alpha: Utilizzo della memoria per la decompressione a thread multiple in byte (--memlimit-mt-decompress). Questo valore non è mai zero perché viene utilizzato un valore predefinito specifico del sistema mostrato nella colonna 5, se non è stato specificato alcun limite in modo esplicito. Inoltre, non è mai maggiore del valore nella colonna 3, anche se è stato specificato un valore maggiore con --memlimit-mt-decompress.
- 5.
- A partire da xz 5.3.4alpha: un limite di utilizzo della memoria predefinito specifico del sistema, che viene utilizzato per limitare il numero di thread durante la compressione con un numero automatico di thread (--threads=0) e non è stato specificato alcun limite di utilizzo della memoria (--memlimit-compress). Questo viene utilizzato anche come valore predefinito per --memlimit-mt-decompress.
- 6.
- A partire da xz 5.3.4alpha: Numero di thread del processore disponibili.
In futuro, l'output di xz --robot --info-memory potrebbe avere più colonne, ma mai più di una singola riga.
Versione¶
xz --robot --version stampa il numero di versione di xz e liblzma nel seguente formato:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
- X
- Versione major.
- YYY
- Versione minor. I numeri pari sono stabili. I numeri dispari sono versioni alfa o beta.
- ZZZ
- Livello di patch per le versioni stabili o solo un contatore per le versioni di sviluppo.
- S
- Stabilità. 0 è alfa, 1 è beta e 2 è stabile. S dovrebbe essere sempre 2 quando YYY è pari.
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.
CODICE DI USCITA¶
- 0
- Tutto bene.
- 1
- È avvenuto un errore.
- 2
- Si è verificato qualcosa che merita un avvertimento, ma non si sono verificati errori effettivi.
Gli avvisi (non gli avvertimenti o gli errori) stampati sullo standard error non influiscono sullo stato di uscita.
AMBIENTE¶
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_DEFAULTS
- Opzioni predefinite specifiche dell'utente o a livello di sistema. In genere questo viene impostato in uno script di inizializzazione della shell per abilitare il valore predefinito del limitatore di utilizzo della memoria di xz, o per impostare il numero di thread predefinito. Escludendo gli script di inizializzazione della shell e analoghi casi particolari, gli script non dovrebbero mai impostare o annullare l'impostazione di XZ_DEFAULTS.
- XZ_OPT
- Questo serve per passare le opzioni a xz quando non sia possibile impostare le opzioni direttamente sulla riga di comando di xz. Questo è il caso quando xz viene eseguito da uno script o da uno strumento, ad esempio GNU tar(1):
XZ_OPT=-2v tar caf foo.tar.xz foo
- Gli script possono usare XZ_OPT, per esempio, per impostare opzioni di compressione predefinite specifiche per lo script. Si raccomanda comunque di permettere agli utenti di sovrascrivere XZ_OPTse questo è ragionevole. Ad esempio, negli script sh(1) si può usare qualcosa come questo:
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
COMPATIBILITÀ LZMA UTILS¶
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.
Livelli di compressione preimpostati¶
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.
File .lzma con flussi vs. senza flussi¶
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.
File .lzma non supportati¶
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à.
Dati sporchi finali¶
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.
NOTE¶
L'output compresso può variare¶
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.
Abilita i decompressori .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.
ESEMPI¶
Informazioni di base¶
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
Compressione parallela di più file¶
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.
Modalità robot¶
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
Catene di filtri di compressione personalizzate¶
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.
VEDERE ANCHE¶
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 |