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 e equivalente a xz --decompress. xzcat e equivalente a xz --decompress --stdout. lzma e equivalente a xz --format=lzma. unlzma e equivalente a xz --format=lzma --decompress. lzcat e 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 e uno strumento di compressione dati generico con sintassi della riga di comando simile a gzip(1) e bzip2(1). Il formato file nativo e .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 piu, e supportata la decompressione del formato .lzusato da lzip. xz comprime o decomprime ogni FILE a seconda della modalita di funzionamento selezionata. Se nessun FILE e indicato o se FILE e -, xz legge dallo standard input e scrive i dati processati sullo standard output. xz si rifiutera (stampera un errore e saltera il FILE) di scrivere dati compressi sullo standard output se e il terminale. Analogamente, xz si rifiutera di leggere dati compressi dallo standard input se e 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: o 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. o 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 gia, viene visualizzato un errore e FILE viene saltato. A meno che non si scriva nello standard output, xz visualizzera un avvertimento e saltera il FILE se si verifica una delle seguenti condizioni: o FILE non e un file regolare. I collegamenti simbolici non vengono seguiti, quindi non sono considerati file regolari. o FILE ha piu di un collegamento "hard". o FILE ha impostati i bit setuid, setgid, o sticky. o La modalita di funzionamento e impostata sulla compressione e il FILE ha gia 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). o La modalita di funzionamento e 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 e 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 e scritto sullo standard output, ne 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 poiche quando lo standard error e un terminale, utilizzando --verbose verra 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 quantita 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, e possibile avere file .xz che richiedono diversi gigabyte di memoria per la decompressione. Soprattutto gli utenti di sistemi piu vecchi possono trovare fastidiosa l'eventualita di un utilizzo molto elevato di memoria. Per evitare spiacevoli sorprese, xz dispone di un limitatore di utilizzo della memoria incorporato, che e disabilitato per impostazione predefinita. Anche se alcuni sistemi operativi forniscono modi per limitare l'utilizzo della memoria dei processi, fare affidamento su questi non e 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 puo essere abilitato con l'opzione della riga di comando --memlimit=LIMITE. Spesso e piu conveniente abilitare il limitatore per impostazione predefinita impostando la variabile d'ambiente XZ_DEFAULTS, ad esempio, XZ_DEFAULTS=--memlimit=150MiB. E 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 e raramente utile perche una singola esecuzione di xz non puo eseguire sia la compressione che la decompressione e --memlimit=LIMITE (or -M LIMITE) e piu breve da digitare sulla riga di comando. Se il limite di utilizzo della memoria specificato viene superato durante la decompressione, xz visualizzera un errore e la decompressione del file fallira. Se il limite viene superato durante la compressione, xz tentera di ridimensionare le impostazioni in modo che il limite non venga piu superato (tranne quando si usa --format=raw o --no-adjust). In questo modo l'operazione non fallira 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 e solo leggermente inferiore alla quantita richiesta per xz -9, le impostazioni saranno ridimensionate solo un poco, non proprio fino a xz -8. Concatenazione e padding con file .xz E possibile concatenare i file .xz cosi come sono. xz decomprimera tali file come se fossero un singolo file .xz. E 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 puo essere utile, ad esempio, se il file .xz e 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 e previsto un argomento intero, e 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 puo essere utilizzato per indicare il valore intero massimo supportato dall'opzione. Modalita operativa Se vengono fornite piu opzioni di modalita operativa, l'ultima ha effetto. -z, --compress Compressione. Questa e la modalita operativa predefinita quando non viene specificata alcuna opzione della modalita operativa e non e determinata nessun'altra modalita operativa dal nome del comando (ad esempio, unxz implica --decompress). Dopo che la compressione e 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 e 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'integrita dei FILE compressi. Questa opzione e 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 modalita elenco, il programma non e 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 piu dettagliate, usare anche l'opzione --verbose. Per avere ancora piu informazioni, usare --verbose due volte, ma si noti che questo puo essere lento, perche 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 puo essere utile se il terminale non e sufficientemente ampio. L'output esatto puo 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 si che xz comprima o decomprima anche se l'input e un collegamento simbolico a un file regolare, ha piu 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: o Se il file di destinazione esiste gia, lo elimina prima di comprimere o decomprimere. o Comprime o decomprime anche se l'input e un collegamento simbolico a un file regolare, ha piu 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. o Quando usato con --decompress --stdout e xz non riesce a riconoscere il tipo di file sorgente, copia il file sorgente cosi com'e 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 piu tipi di file anziche copiarli come sono sullo standard output. --format=FORMATO puo 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 anziche 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 piu 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 modalita operativa non e --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, purche lo standard output sia collegato a un file regolare e siano soddisfatte alcune condizioni aggiuntive per renderlo sicuro. La creazione di file sparsi puo risparmiare spazio su disco e velocizzare la decompressione riducendo la quantita di I/O su disco. -S .SUFFISSO, --suffix=.SUFFISSO Durante la compressione, utilizzare .suf come suffisso per il file di destinazione anziche .xz o .lzma. Se non si scrive nello standard output e il file di origine ha gia 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, perche non esiste un suffisso predefinito per i flussi grezzi. --files[=FILE] Legge i nomi dei file da processare da FILE; se FILE e omesso, i nomi dei file vengono letti dallo standard input. I nomi dei file devono essere terminati da un carattere "a capo". Un trattino (-) e 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 e 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 e l'impostazione predefinita. Quando si comprime, auto e 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 e 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 e fornito per retrocompatibilita con le LZMA Utils. lzip Accetta solo file .lz per la decompressione. La compressione non e 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 poiche 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 e 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 e stata aggiunta in lzip 1.6. Questa estensione e utilizzata raramente e non e supportata da xz(viene segnalata come input corrotto). raw Comprime o decomprime un flusso grezzo (senza intestazione). Questo e 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 integrita. 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 integrita. Il controllo di integrita (se presente) viene verificato quando il file .xz viene decompresso. Tipi di CONTROLLI supportati: none Non calcola proprio il controllo di integrita. Questo in genere e una pessima idea. Puo essere utile quando l'integrita 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 e l'impostazione predefinita, perche e leggermente migliore della CRC32 nel rilevare i file danneggiati e la differenza di velocita e trascurabile. sha256 Calcola la firma SHA-256. Questo e un po' piu lento che CRC32 e CRC64. L'integrita delle intestazioni .xz viene sempre verificata con CRC32. Non e possibile modificarlo o disabilitarlo. --ignore-check Non verifica il controllo di integrita dei dati compressi durante la decompressione. Il valore CRC3 nelle intestazioni .xz sara ancora verificata normalmente. Non usare questa opzione se non si e consci di cosa si sta facendo. Possibili ragioni per utilizzare questa opzione: o Tentativo di recupero dei dati da un file .xz corrotto. o Accelerazione della decompressione. Questo e 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'integrita del file non venga verificata esternamente in altro modo. -0 ... -9 Selezionare un livello di compressione preimpostato. Il valore predefinito e -6. Se vengono specificati piu livelli preimpostati, l'ultimo ha effetto. Se e gia 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 piu 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 e 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 e piu veloce di gzip -9 e comprime molto meglio. Quelli piu alti hanno spesso una velocita 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 e il valore predefinito, che di solito e 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 piu elevati. Sono utili solo quando si comprimono file di dimensioni superiori a 8 MiB, 16 MiB e 32 MiB, rispettivamente. A parita di hardware, la velocita di decompressione e approssimativamente un numero costante di byte di dati compressi al secondo. In altre parole, migliore e la compressione, piu veloce sara di solito la decompressione. Cio significa anche che la quantita di output non compresso prodotta al secondo puo 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: o DictSize e la dimensione del dizionario LZMA2. E uno spreco di memoria usare un dizionario piu grande della dimensione del file non compresso. Ecco perche e una buona cosa evitare di usare i livelli preimpostati -7 ... -9 quando non c'e reale necessita. Con -6 e inferiori, la quantita di memoria sprecata in genere e sufficientemente bassa da essere trascurabile. o CompCPU e una rappresentazione semplificata delle impostazioni di LZMA2 che influenzano la velocita di compressione. Anche la dimensione del dizionario influenza la velocita, quindi mentre CompCPU e lo stesso per i livelli -6 ... -9, i livelli piu alti tendono ancora ad essere un po' piu lenti. Per avere una compressione ancora piu lenta e quindi potenzialmente migliore, utilizzare --extreme. o CompMem contiene i requisiti di memoria del compressore in modalita a singola thread. Puo variare leggermente tra le versioni di xz. o 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 e 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 modalita a thread multiple sono significativamente piu alti che per la modalita thread singola. Con il valore predefinito di --block-size, ogni thread richiede 3*3*dimensione del dizionario piu 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 piu 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 e 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 piu 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 piu veloce al piu lento e -5, -6, -5e, e -6e. --fast --best Questi sono alias in qualche modo fuorvianti per -0 e -9, rispettivamente. Sono forniti solo per retrocompatibilita 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 modalita a thread multiple, ma puo essere utilizzata anche in modalita thread singola. In modalita 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 e tre volte la dimensione del dizionario LZMA2 e comunque almeno 1 MiB. Tipicamente un buon valore e 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 verra mai riempito completamente. In modalita a thread multiple, la dimensione dei blocchi e conservata nelle intestazioni dei blocchi. L'informazione sulla dimensione e richiesta per la decompressione a thread multiple. Nella modalita 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 modalita a thread singola non saranno identici ai file creati in modalita a thread multiple. La mancanza di informazioni sulle dimensioni significa anche che xz non sara in grado di decomprimere i file in modalita 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 e 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 piu virgole consecutive) e una scorciatoia per utilizzare le dimensioni e i filtri dell'elemento precedente. Se il file di input e piu grande della somma delle dimensioni in ELEMENTI, l'ultimo elemento viene ripetuto fino alla fine del file. Il valore speciale 0 puo essere utilizzato come ultima dimensione per indicare che il resto del file deve essere codificato come un singolo blocco. E 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 puo essere utilizzata per indicare la catena di filtri predefinita, che equivale a non specificare una catena di filtri. L'identificatore della catena di filtri puo 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: o La catena dei filtri specificata da --filters1 e un input di 2 MiB o La catena dei filtri specificata da --filters3 e un input di 2 MiB o La catena dei filtri specificata da --filters2 e un input di 4 MiB o La catena dei filtri specificata da --filters2 e un input di 4 MiB o La catena di filtri predefinita e l'input di 2 MiB o 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 modalita thread oppure il valore specificato con --block-size=DIMENSIONE), il codificatore creera 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 e di 80 MiB, si otterranno 11 blocchi: 5, 10, 8, 10, 2, 10, 10, 4, 10, 10, and 1 MiB. In modalita a thread multiple, le dimensioni dei blocchi vengono memorizzate nelle intestazioni dei blocchi. Questo non avviene in modalita thread singola, quindi l'output codificato non sara identico a quello della modalita a thread multiple. --flush-timeout=TIMEOUT Quando si comprime, se sono passati piu 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 puo 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 funzionalita e disabilitata per impostazione predefinita. Se questa opzione viene specificata piu di una volta, l'ultima ha effetto. Il valore speciale TIMEOUT di 0 puo essere utilizzato per disabilitare esplicitamente questa funzionalita. Questa funzionalita non e disponibile sui sistemi non-POSIX. Questa funzionalita e sperimentale. Attualmente xz non e 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'unita di archiviazione prima di rimuovere il file sorgente. Questo puo migliorare le performance se si sta comprimendo o decomprimendo tanti piccoli file. Tuttavia, se il sistema dovesse andare in crash subito dopo l'eliminazione, e possibile che il file destinazione non sia ancora stato scritto sull'unita di archiviazione mentre l'operazione di eliminazione si. In questo caso non saranno piu disponibili ne il file sorgente originale ne 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 piu volte, ha effetto l'ultima. Se le impostazioni di compressione superano il valore LIMITE, xz tentera di regolare le impostazioni verso il basso in modo che il limite non venga piu superato e visualizzera un avviso che indica che e stata eseguita una regolazione automatica. Le regolazioni vengono eseguite in questo ordine: riduzione del numero di thread, passaggio alla modalita a thread singola se anche un solo thread in modalita a thread multiple supera il LIMITE, e infine riducendo la dimensione del dizionario LZMA2. Quando si comprime con --format=raw oppure se si e specificato --no-adjust, e possibile ridurre solo il numero di thread, poiche questo puo essere fatto senza influire sull'output compresso. Se non e possibile soddisfare il LIMITE anche con le regolazioni sopra descritte, viene visualizzato un errore e xz uscira con lo stato di uscita 1. Il LIMITE puo essere specificato in diversi modi: o Il LIMITE puo essere un valore assoluto in byte. Usare un suffisso intero come MiB puo essere utile. Ad esempio: --memlimit-compress=80MiB o Il LIMITE puo essere specificato come percentuale della memoria fisica (RAM) totale. Questo puo essere utile specialmente quando si imposta la variabile di ambiente XZ_DEFAULTS in uno script di inizializzazione di shell che e condiviso tra computer diversi. In questo modo il limite e automaticamente piu grande sui sistemi con piu memoria. Ad esempio: --memlimit-compress=70% o Il LIMITE puo 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 puo 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 modalita --list. Se l'operazione non e possibile senza oltrepassare il LIMITE, xz mostrera un errore e la decompressione del file fallira. 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 puo influire solo sul numero di thread; non indurra mai xz a rifiutarsi di decomprimere un file. Se LIMITE e troppo basso per consentire le thread multiple, il LIMITE viene ignorato e xz continuera in modalita a thread singola. Si noti che se viene utilizzato anche --memlimit-decompress, si applichera sempre sia alla modalita a thread singola che a quella a thread multiple, e quindi il LIMITE effettivo per le thread multiple non sara 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 puo essere utilizzato per vedere il valore corrente. Questa opzione e il suo valore predefinito esistono perche, senza un limite, il decompressore a thread multiple potrebbe finire per allocare una quantita folle di memoria per alcuni file input. Se il valore predefinito LIMITE e troppo basso sul proprio sistema, e possibile aumentarlo liberamente, ma non deve essere mai impostato a un valore piu grande della quantita di RAM utilizzabile, in quanto con file di input appropriati xz cerchera di utilizzare quella quantita di memoria anche con un basso numero di thread. Esaurire la memoria o fare swap non migliorera 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 e possibile soddisfare il limite di utilizzo della memoria senza regolare le impostazioni che influiscono sull'output compresso. In altre parole, cio impedisce a xz di passare il codificatore dalla modalita multi-thread alla modalita a thread singola e di ridurre le dimensioni del dizionario LZMA2. Anche quando viene usata questa opzione, il numero di thread puo essere ridotto per soddisfare il limite di utilizzo della memoria, in quanto cio non influira sull'output compresso. La regolazione automatica e 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 si che xz utilizzi fino a un numero di thread che il processore/i del sistema supportano. Il numero effettivo di thread puo essere inferiore a THREADS se il file di input non e sufficientemente grande per il threading con le impostazioni specificate o se l'utilizzo di piu 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 produrra la dimensione del file piu piccola, ma solo l'output del compressore a thread multiple puo essere decompresso utilizzando piu thread. Impostando THREADS su 1 verra utilizzata la modalita a thread singola. L'impostazione di THREADS su qualsiasi altro valore, incluso 0, utilizzera il compressore a thread multiple anche se il sistema supporta un solo thread hardware. (xz 5.2.x utilizzava la modalita a thread singola in questa situazione.) Per utilizzare la modalita 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 puo comunque far passare xz alla modalita a thread singola a meno che non venga utilizzato --no-adjust. Il supporto per il prefisso + e stato aggiunto in xz 5.4.0. Se e stato richiesto un numero automatico di thread e non e stato specificato alcun limite di utilizzo della memoria, verra utilizzato un limite "soft" predefinito, specifico del sistema, per limitare eventualmente il numero di thread. E un limite "soft" nel senso che viene ignorato se il numero di thread diventa uno, quindi un limite soft non impedira mai a xz di comprimere o decomprimere. Questo limite soft predefinito non fara passare xz dalla modalita a thread multiple alla modalita 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 puo essere sovrascritta con l'opzione --block-size=DIMENSIONE. La decompressione a thread multiple funziona solo su file che contengano piu blocchi con l'informazione della dimensione nelle intestazioni del blocco. Tutti i file sufficientemente grandi compressi in modalita a thread multiple soddisfano questa condizione, mentre i file compressi in modalita thread singola no, neanche se si e utilizzato --block-size= DIMENSIONE. Il valore predefinito per THREADS e 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 piu 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 e 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 e 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 e inerente alla struttura del filtro oppure esiste per evitare problemi di sicurezza. Una catena di filtri personalizzata puo 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 puo essere specificata utilizzando una o piu singole opzioni di filtro nell'ordine desiderato nella catena di filtri. Questo significa che l'ordine delle singole opzioni di filtro e importante! Quando si decodificano i flussi grezzi (--format=raw), la catena di filtri deve essere specificata nello stesso ordine in cui e stata specificata durante la compressione. Qualsiasi filtro individuale o opzione livello preimpostato specificata prima dell'opzione della catena completa (--filters=FILTRI) verra 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 puo 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 puo essere preceduto da un - e seguito da zero o piu flag. L'unico flag supportato e 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 e un filtro obsoleto, supportato quasi esclusivamente a causa del formato obsoleto di file .lzma, che supporta solo LZMA1. LZMA2 e una versione aggiornata di LZMA1 che risolve alcuni problemi pratici di LZMA1. Il formato .xz utilizza LZMA2 e non supporta LZMA1. La velocita 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 puo essere seguito da modificatori costituiti da una singola lettera. Il numero intero puo andare da 0 a 9, corrispondenti alle opzioni della riga di comando -0 ... -9. L'unico modificatore attualmente supportato e 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. Piu grande e il dizionario, maggiore e la possibilita di trovare una corrispondenza. Quindi, l'aumento della DIMENSIONE del dizionario di solito migliora il rapporto di compressione, ma un dizionario piu grande del file non compresso e uno spreco di memoria. Una DIMENSIONE tipica per un dizionario e da 64 KiB a 64 MiB. Il minimo e 4 KiB. Il massimo per la compressione e attualmente 1.5 GiB (1536 MiB). La decompressione supporta gia dizionari fino a 4 GiB meno 1 byte, che e 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 e necessaria la stessa DIMENSIONE del dizionario utilizzata durante la compressione (o piu grande), quindi l'utilizzo della memoria del decodificatore e 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 e 0 e il massimo e 4; Il valore predefinito e 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 piu alti del byte non compresso precedente siano correlati al byte successivo. Ad esempio, in un tipico testo inglese, una lettera maiuscola e spesso seguita da una lettera minuscola e una lettera minuscola e solitamente seguita da un'altra lettera minuscola. Nel set di caratteri US-ASCII, i tre bit piu alti sono 010 per le lettere maiuscole e 011 per le lettere minuscole. Quando lc e almeno 3, la codifica letterale puo sfruttare questa proprieta nei dati non compressi. Il valore predefinito (3) solitamente e 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 e 0 e il massimo e 4; Il valore predefinito e 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 e 0 e il massimo e 4; Il valore predefinito e 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 e spesso una buona scelta se non c'e un'ipotesi migliore. Quando l'allineamento e noto, impostare pb concordemente puo 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 puo migliorare leggermente la compressione. Per il testo UTF-16, pb=1 e una buona scelta. Se l'allineamento e un numero dispari, come 3 byte, pb=0 potrebbe essere la scelta migliore. Anche se l'allineamento assunto puo 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 velocita del codificatore, sull'utilizzo della memoria e sul rapporto di compressione. Di solito i cercatori di corrispondenze a catena hash sono piu 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 piu vicine alla realta quando DIZIONARIO e 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=MODALITA La MODALITA di compressione specifica il metodo per analizzare i dati prodotti dal cercatore di corrispondenze. Le MODALITA supportate sono fast e normal. Il predefinito e 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 e 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 puo valere 2-273 byte. Valori piu alti tendono a dare un miglior rapporto di compressione ai danni della velocita. Il valore predefinito dipende dal PRESET. depth=PROFONDITA Specificare la profondita di ricerca massima nel cercatore di corrispondenze. Il valore predefinito e il valore speciale 0, che dice al compressore di determinare una PROFONDITA ragionevole da CERCATORE e NICE. Una PROFONDITA ragionevole per le catene hash e 4-100 e 16-1000 per gli alberi binari. Utilizzando valori di PROFONDITA molto alti si puo rendere il codificatore estremamente lento con alcuni file. Evitare di impostare la PROFONDITA 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 puo aiutare LZMA2 a produrre .xz file 0-15 % piu 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 puo determinare un rapporto di compressione leggermente peggiore. I filtri BCJ sono molto veloci e usano una quantita di memoria minima. Questi filtri BCJ presentano problemi noti relativi al rapporto di compressione: o 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 peggiorera la compressione con questi file. o Se un filtro BCJ viene applicato a un archivio, e 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 rendera i file meno simili e quindi la compressione sara peggiore. Anche il contenuto dei file non eseguibili nello stesso archivio puo 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 e 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 puo essere migliorato leggermente se le opzioni LZMA2 sono impostate in modo che corrispondano all'allineamento del filtro BCJ selezionato. Esempi: o Il filtro IA-64 ha un allineamento a 16 byte, quindi pb=4,lp=4,lc=0 e una buona scelta per LZMA2 (2^4=16). o 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, e meglio pb=2,lp=2,lc=2. Si puo usare readelf -h per controllare se "RVC" appare sulla riga del "Flag". o ARM64 e sempre allineato a 4 byte, quindi pb=2,lp=2,lc=2 e la scelta migliore. o Il filtro x86 e un'eccezione. Di solito e 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 e zero. In pratica, l'impostazione predefinita e buona; specificare un OFFSET personalizzato non e 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 e supportato solo un semplice calcolo delta byte-per-byte. Puo 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 e vero specialmente per l'audio, che comprime piu 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 e 1. Per esempio, con dist=2 e un input di 8 byte A1 B1 A2 B3 A3 B5 A4 B7, l'output sara 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 e stato eliminato, lo stato di uscita che indica un avvertimento viene comunque utilizzato. -v, --verbose Sii prolisso. Se lo standard error e collegato a un terminale, xz visualizzera un indicatore di avanzamento. Specificando --verbose due volte si otterra un output ancora piu dettagliato. L'indicatore di avanzamento mostra le seguenti informazioni: o La percentuale di avanzamento e mostrata se la dimensione del file input e nota. Quindi, la percentuale non puo essere mostrata nei pipe. o Quantita di dati compressi prodotti (in compressione) o utilizzati (in decompressione). o Quantita di dati non compressi consumati (in compressione) o prodotti (in decompressione). o Rapporto di compressione, calcolato dividendo la quantita di dati compressi processati finora con la quantita di dati non compressi processati finora. o Velocita di compressione o decompressione. Questa e misurata come la quantita di dati non compressi consumati (in compressione) o prodotti (in decompressione) al secondo. Viene mostrata dopo che e trascorso qualche secondo da quando xz ha iniziato a processare il file. o Tempo trascorso nel formato M:SS o H:MM:SS. o Il tempo residuo stimato e mostrato solo quando la dimensione del file in ingresso e nota e sono gia passati un paio di secondi da quando xz ha iniziato a processare il file. Il tempo e mostrato in un formato meno preciso che non ha mai i due punti, ad esempio 2 min 30 s. Quando lo standard error non e un terminale, --verbose fara stampare a xz il nome del file, la dimensione compressa, la dimensione non compressa, il rapporto di compressione, e potendo anche la velocita e il tempo trascorso, su una singola riga dello standard error, dopo aver compresso o decompresso il file. La velocita e il tempo trascorso sono inclusi solo se l'operazione e durata almeno un paio di secondi. Se l'operazione non e 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 e 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 MODALITA 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 piu comunemente, e termina con successo. -H, --long-help Mostra un messaggio di aiuto che descrive tutte le funzionalita 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. MODALITA ROBOT La "modalita robot" viene attivata con l'opzione --robot. Rende l'output di xz piu facile da analizzare da altri programmi. Attualmente --robot e supportato solo insieme a --list, --filters-help, --info-memory e --version. In futuro sara supportato per la compressione e la decompressione. Modalita 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 e sempre la prima riga quando si inizia a elencare un file. La seconda colonna della riga e 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 e stato specificato --verbose. Sono presenti tante righe stream quanti sono i flussi nel file .xz. block Questo tipo di riga viene utilizzato solo quando e 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 e 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 e 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 e oltre 9999, al posto del rapporto vengono mostrati tre trattini (---). 7. Elenco separato da virgole dei nomi dei controlli di integrita. 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 e 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 e 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 integrita 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 e 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 integrita Se --verbose viene specificato due volte, sono incluse colonne aggiuntive nelle righe block. Queste non sono mostrate con un --verbose singolo, perche recuperare queste informazioni richiede molte ricerche e quindi puo essere lento: 11. Valore del controllo di integrita in formato esadecimale 12. Dimensione intestazione blocco 13. Flag del blocco: cindica che e presente la dimensione compressa, u indica che e presente la dimensione non compressa. Se il flag non e 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. Quantita 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 e nota, perche solo le opzioni necessarie per la decompressione sono memorizzate nelle intestazioni .xz. Le colonne delle righe summary: 2. Quantita 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 integrita 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. Quantita 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 e mostrato su una riga dedicata. Informazione limite memoria xz --robot --info-memory stampa una singola riga con piu colonne separate da tabulazione: 1. Quantita 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 modalita 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 modalita 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 e mai zero perche viene utilizzato un valore predefinito specifico del sistema mostrato nella colonna 5, se non e stato specificato alcun limite in modo esplicito. Inoltre, non e mai maggiore del valore nella colonna 3, anche se e 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 e 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 piu colonne, ma mai piu 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 Stabilita. 0 e alfa, 1 e beta e 2 e stabile. S dovrebbe essere sempre 2 quando YYY e pari. XYYYZZZS sono uguali su entrambe le righe se xz e liblzma appartengono allo stesso rilascio delle XZ Utils. Esempi: 4.999.9beta e 49990091 e 5.0.0 e 50000002. CODICE DI USCITA 0 Tutto bene. 1 E avvenuto un errore. 2 Si e 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 e --help che forza xz a mostrare la pagina di aiuto anziche 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 prolissita 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 e 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 e ragionevole. Ad esempio, negli script sh(1) si puo usare qualcosa come questo: XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT COMPATIBILITA LZMA UTILS La sintassi della riga di comando di xz e essenzialmente un sopra-insieme di lzma, unlzma, e lzcat come trovati nelle LZMA Utils 4.32.x. Nella maggior parte dei casi e possibili sostituire le LZMA Utils con le XZ Utils senza rompere gli script esistenti. Ci sono pero alcune incompatibilita, che in alcuni casi potrebbero causare problemi. Livelli di compressione preimpostati La numerazione dei livelli di compressione preimpostati non e identica in xz e nelle LZMA Utils. La differenza piu importante e il modo in cui le dimensioni del dizionario vengono mappate sulle diverse preimpostazioni. La dimensione del dizionario e 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 piu 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 e -7 mentre nelle XZ Utils e -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 puo 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 e 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 puo 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 e 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, perche praticamente tutti i file .lzma sono stati compressi con impostazioni che liblzma accettera. Dati sporchi finali Quando si decomprime, le LZMA Utils ignorano automaticamente tutto quello che c'e dopo il primo flusso .lzma. Nella maggior parte delle situazioni questo e 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 puo far rompere script incomprensibili che hanno assunto che i dati sporchi finali vengano ignorati. NOTE L'output compresso puo variare L'esatto output compresso prodotto dallo stesso file di input non compresso puo variare tra le versioni delle XZ Utils, anche se le opzioni di compressione sono le stesse. Questo perche il codificatore puo essere stato migliorato (compressione piu veloce o migliore) senza influire sul formato del file. L'output puo 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 e 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 puo 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 integrita CONTROLLO diversi da none e crc32. Dal momento che il valore predefinito e --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 integrita se il particolare CONTROLLO non e 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 e piu 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 puo 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 piu file Su GNU e *BSD, find(1) e xargs(1) possono essere usati per parallelizzare la compressione di piu 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 piu puo essere appropriato per ridurre il numero di processi xz che xargs(1) alla fine creera. L'opzione -T1 per xz serve a forzare la modalita a thread singola, perche xargs (1) viene utilizzato per controllare la quantita di parallelizzazione. Modalita robot Calcola quanti byte sono stati salvati in totale dopo la compressione di piu 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 e 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 e gia 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 piu semplice delle catene di filtri personalizzate e la personalizzazione di un preset di LZMA2. Questo puo essere utile, perche 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 piu velocemente di quanto farebbe xz -8, e possibile modificare un preset con un basso valore CompCPU (ad esempio, 1) per utilizzare un dizionario piu grande: xz --lzma2=preset=1,dict=32MiB foo.tar Con alcuni file, il comando sopra potrebbe essere piu 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 piu ovvia in cui un dizionario grande puo aiutare molto e un archivio contenente file molto simili di almeno un paio di megabyte ciascuno. La dimensione del dizionario deve essere significativamente piu 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 e accettabile, e il file da comprimere e almeno di diverse centinaia di megabyte, potrebbe essere utile utilizzare un dizionario ancora piu 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 puo essere utile per vedere i requisiti di memoria del compressore e del decompressore. Tenere presente che l'utilizzo di un dizionario piu grande della dimensione del file non compresso e uno spreco di memoria, quindi il comando precedente non e 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 puo essere decompresso con XZ Embedded (ecco perche c'e --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 puo 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 piu 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 %) piu 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 puo 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 e significativo. Se viene specificato --x86 dopo --lzma2, xz dara un errore, perche non puo esserci alcun filtro dopo LZMA2 e anche perche il filtro BCJ x86 non puo essere utilizzato come ultimo filtro della catena. Il filtro Delta insieme con LZMA2 puo dare buoni risultati sulle immagini bitmap. Di solito dovrebbe battere il PNG, il quale ha alcuni filtri piu 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 e 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 piu immagini sono state inserite in un singolo archivio (ad esempio, .tar), il filtro Delta funzionera anche su questo purche 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> Tukaani 08/03/2025 XZ(1)