Manpages

NOME

bzip2, bunzip2 − compressore di file a ordinamento di blocco, v0.9.5
bzcat − decomprime i file nello stdout
bzip2recover − recupera dati da un file bzip2 danneggiato

SINTASSI

bzip2 [ −cdfkqstvzVL123456789 ] [ nomifile ... ]
bunzip2
[ −fkvsVL ] [ nomifile ... ]
bzcat
[ −s ] [ nomifile ... ]
bzip2recover
nomefile

DESCRIZIONE

bzip2 comprime i file usando l’algoritmo di compressione a ordinamento di blocco (block sorting) di Burrows-Wheeler e la codifica Huffman. La compressione è, in generale, notevolmente migliore di quella ottenuta dai più convenzionali compressori basati su LZ77/LZ78 e si avvicina alle prestazioni dei compressori statistici della famiglia PPM.

Le opzioni della linea di comando sono deliberatamente molto simili a quelle del gzip GNU, ma non sono identiche.

bzip2 accetta una lista di nomi di file affiancata da opzioni. Ogni file è rimpiazzato dalla propria versione compressa, con il nome "nome_originale.bz2". Ogni file compresso ha la stessa data di modifica, gli stessi permessi e, quando possibile, lo stesso proprietario dell’originale corrispondente, in modo che queste proprietà possano essere correttamente ripristinate al momento della decompressione. La gestione dei nomi di file è banale, visto che non ci sono meccanismi per preservare nomi originali dei file, permessi o date in filesystem che non hanno questi concetti o che hanno serie restrizioni sulla lunghezza dei nomi di file, alla MS-DOS.

bzip2 e bunzip2 normalmente non sovrascrivono i file; per fare questo si specifichi l’opzione −f.

Se sono stati dati nomi di file, bzip2 comprime dallo standard input nello standard output. In questo caso, bzip2 si rifiuta di scrivere l’output compresso, che sarebbe completamente incomprensibile e quindi inutile, sul terminale.

bunzip2 (o bzip2 −d ) decomprime tutti i file dati. I file non creati da bzip2 saranno individuati e ignorati, mostrando un messaggio di attenzione. bzip2 cerca di dare un nome al file decompresso creandolo da quello compresso nel modo seguente:

nomefile.bz2 diventa nomefile
nomefile.bz diventa nomefile
nomefile.tbz2 diventa nomefile.tar
nomefile.tbz diventa nomefile.tar
qualunquenome diventa qualunquenome.out

Se il nome del file non termina in uno dei modi riconusciuti, cioè .bz2, .bz, .tbz2 o .tbz, bzip2 si lamenta che è impossibile ricavare il nome originale del file e quindi usa quello dato sulla linea di comando con l’aggiunta dell’estensione .out. Come per la compressione l’assenza dei nomi di file causa la decompressione da standard input a standard output.

bunzip2 decomprime correttamente un file che è la concatenazione di due o più file compressi ottenendo la concatenazione dei corrispondenti file non compressi. È supportato anche il test di integrità (−t) dei file compressi concatenati.

Passando l’opzione −c, si può anche comprimere o decomprimere file nello standard output. Con questo sistema più file possono essere compressi o decompressi e gli output risultanti sono mandati in sequenza nello stdout. La compressione di più file in questo modo genera uno stream contenente la rappresentazione di più file compressi. Questo stream può essere decompresso correttamente solo dalla versione 0.9.0 o successiva di bzip2, mentre le versioni precedenti di bzip2 terminano dopo la decompressione del primo file nello stream.

bzcat (o bzip2 -dc ) decomprime tutti i file specificati nello standard output.

bzip2 legge gli argomenti dalle variabili di ambiente BZIP2 e BZIP, in questo ordine, e le elabora prima di qualsiasi argomento della riga di comando; in questo modo si possono convenientemente assegnare degli argomenti predefiniti.

La compressione è sempre effettuata, anche quando il file compresso è leggermente più grande dell’originale. File con dimensioni inferiori a circa un centinaio di byte tendono a diventare più grandi, visto che il metodo di compressione tende ad utilizzare una cinquantina di byte extra. Dati aleatori (incluso l’output di molti compressori di file) sono codificati a circa 8.05 bit per byte, dando quindi un espansione di circa 0.5%.

Come controllo interno di protezione, bzip2 usa CRC a 32-bit per assicurarsi che la versione decompressa di un file sia identica all’originale. Questo protegge contro la corruzione dei dati compressi, e contro i bachi, non ancora scoperti, in bzip2 (si spera rarissimi). La possibilità che non ci si accorga della corruzione di dati è microscopica: circa una su quattro miliardi per ogni file elaborato. Comunque, questo controllo viene fatto dopo la decompressione, quindi può solo rivelare un errore; non può aiutare a recuperare i dati originali non compressi. Si può usare bzip2recover per provare a recuperare i dati da un file danneggiato.

Valori restituiti: 0 per un’uscita normale, 1 per problemi nell’ambiente (file non trovato, opzioni non valide, errori di I/O, ecc.), 2 per indicare un file compresso corrotto, 3 per un’incoerenza interna (baco) che manda bzip2 in allarme.

OPZIONI

−c --stdout

Comprime o decomprime nello standard output.

−d --decompress

Forza la decompressione. bzip2, bunzip2 e bzcat sono in realtà lo stesso programma, e la decisione su quale azione intraprendere è fatta sulla base del nome utilizzato. Questa opzione si sovrappone a questo meccanismo, e forza bzip2 alla decompressione.

−z --compress

Il contrario di −d: forza la compressione, ignorando il nome con cui è chiamato.

−t --test

Controlla l’integrità del file specificato, ma non decomprime. In realtà viene fatta una decompressione di prova e il risultato gettato via.

−f --force

Forza la sovrascrittura dei file di output. Normalmente, bzip2 non sovrascrive i file di output esistenti. Obbliga bzip2 a interrompere i collegamenti fisici (hard link) ai file.

−k --keep

Mantiene (non cancella) i file di input durante la compressione o la decompressione.

−s --small

Riduce l’uso della memoria, per la compressione, la decompressione e il test. I file sono decompressi e testati usando un algoritmo modificato che richiede solo 2,5 byte per blocco di byte. Questo significa che qualsiasi file può essere decompresso in 2300K di memoria, ma solamente alla metà della velocità normale.

Durante la compressione, -s seleziona una dimensione di blocco di 200K, che limita l’uso della memoria a circa la stessa cifra, limitando il rapporto di compressione. In breve, se la macchina ha poca memoria (8 megabyte o meno), si usi sempre -s. Vedere sotto GESTIONE DELLA MEMORIA.

−q --quiet

Sopprime i messaggi di avvertimento non essenziali, mentre i messaggi riguardanti gli errori di I/O e altri eventi critici non saranno eliminati.

−v --verbose

Modo verboso: mostra il rapporto di compressione per ogni file elaborato. Ulteriori −v incrementano il livello di verbosità, mostrando molte informazione usate principalmente a scopi diagnostici.

−L --license -V --version

Mostrano la versione del software, i termini e le condizioni di licenza.

−1 a −9

Modificano la dimensione di blocco a 100 K, 200 K, .. 900 K quando comprime, mentre non hanno effetti sulla decompressione. Vedere sotto GESTIONE DELLA MEMORIA

−-

Tratta tutti gli argomenti seguenti come nomi di file, anche se questi iniziano con un "-". Con questo è possibile elaborare file con nomi che iniziano con "-", per esempio: bzip2 −- −nomefile

−-repetitive-fast --repetitive-best

Questi parametri sono ridondanti nelle versioni 0.9.5 e successive, mentre precedentemente controllavano alcuni comportamenti nell’algoritmo di ordinamento, che talvolta erano utili. Le versioni 0.9.5 e successive hanno un algoritmo migliorato che rende questi parametri irrilevanti.

GESTIONE DELLA MEMORIA

bzip2 comprime i grandi file in blocchi. La dimensione di blocco influenza sia il rapporto di compressione ottenuto che la quantità di memoria necessaria per la compressione e la decompressione. Le opzioni da −1 a −9 specificano che la dimensione di blocco sarà rispettivamente da 100.000 byte a 900.000 byte (il default). Al momento della decompressione la dimensione di blocco usata per la compressione viene letta dall’intestazione del file compresso, quindi bunzip2 alloca la memoria necessaria per decomprimere il file. Dal fatto che la dimensione del blocco è inserita nei file compressi, ne consegue che le opzioni da −1 a −9 sono irrilevanti e quindi ignorate durante la decompressione. La richiesta di memoria, in byte, per la compressione e la decompressione può essere stimata in:

Compressione: 400K + ( 8 x dimensione blocco )

Decompressione: 100K + ( 4 x dimensione blocco ), o
100K + ( 2.5 x dimensione blocco )

Incrementi nella dimensione di blocco portano a rapide diminuizioni dei margini di guadagno. Molta compressione viene dalla prime due o tre centinaia di K della dimensione di blocco, un fatto da tenere presente quando si usa bzip2 su piccole macchine. Quindi è importante notare che la richiesta di memoria per la decompressione è fatta al momento della compressione con la scelta della dimensione di blocco.

Per i file compressi con la dimensione di blocco predefinita di 900K, bunzip2 richiede circa 3700 Kbyte per la decompressione. Per poter decomprimere qualsiasi file su macchine da 4 megabyte, bunzip2 ha un opzione per decomprimere usando approssimativamente la metà di questa quantità di memoria, cioè 2300 Kbyte. Essendo la velocità di decompressione dimezzata, questa opzione va usata solo in caso di necessità. L’opzione in questione è −s.

In generale, si provi a usare la maggiore dimensione di blocco possibile, così da massimizzare la compressione ottenuta. La velocità di compressione e decompressione non è, teoricamente, influenzata dalla dimensione di blocco.

Un altro punto significativo si applica ai file che sono contenuti in un singolo blocco -- il ché, usando una grande dimensione di blocco, si applica a molti file. La quantità di memoria reale usata è proporzionale alla dimensione del file, quando il file è più piccolo di un blocco. Per esempio, la compressione di un file di 20.000 byte con l’opzione −9 causa l’allocazione da parte del compressore di circa 7600K di memoria, ma usa solamente 400K + 20000 * 8 = 560. Similmente, il decompressore alloca 3700K ma usa solamente 100K + 20000 * 4 = 180 Kbyte.

Ecco una tabella che riassume l’uso massimo di memoria per le varie dimensioni di blocco. Registra anche la dimensione compressa totale di 14 file del "Calgary text compression corpus" totalizzante 3.141.622 byte. Questa colonna dà alcune indicazioni di come varia la compressione con le dimensioni di blocco evidenziando il vantaggio della grande dimensione di blocco per grandi file, mentre il Corpus ha soprattutto piccoli file.

Compres- Decompres- Decompres- Dimensione
Opzione sione sione ione con -s Corpus

-1 1200K 500K 350K 914704
-2 2000K 900K 600K 877703
-3 2800K 1300K 850K 860338
-4 3600K 1700K 1100K 846899
-5 4400K 2100K 1350K 845160
-6 5200K 2500K 1600K 838626
-7 6100K 2900K 1850K 834096
-8 6800K 3300K 2100K 828642
-9 7600K 3700K 2350K 828642

RECUPERARE DATI DA FILE DANNEGGIATI

bzip2 comprime i file in blocchi, di solito lunghi 900 Kbyte. Visto che ciascun blocco è modificato separatamente, se il supporto fisico o un errore di trasmissione causano un danneggiamento in un file .bz2 multi-blocco, può essere possibile recuperare i dati dai blocchi non danneggiati nel file.

La rappresentazione compressa di ogni blocco è delimitata da un modello a 48-bit, che dà la possibilità di trovare il limite del blocco con ragionevole certezza. Ogni blocco contiene il proprio CRC a 32-bit, così i blocchi danneggiati possono distinguersi da quelli non danneggiati.

bzip2recover è un semplice programma il cui scopo è di cercare i blocchi in un file .bz2. Si può usare bzip2 −t per controllare l’integrità dei file risultanti e decomprimere quelli non danneggiati.

bzip2recover prende un singolo argomento, cioè il nome del file danneggiato, e scrive alcuni file del tipo "rec0001file.bz2", "rec0002file.bz2", ecc., contenenti i blocchi estratti. I nomi dei file di output sono fatti in modo da poter usare metacaratteri nelle elaborazioni sucessive -- per esempio, "bzip2 -dc rec*file.bz2 > dati_recuperati" forma la lista dei file nell’ordine corretto.

bzip2recover è utile se usato con file .bz2 grandi, visto che questi contengono molti blocchi. È ovviamente inutile usarlo con un file contenente un solo blocco, a causa dell’impossibilità di recuperare un blocco danneggiato. Quindi, se si vuole minimizzare le potenziali perdite di dati causate dai supporti fisici o dagli errori di trasmissione, si può comprimere con una piccola dimensione di blocco.

NOTE SULLE PRESTAZIONI

La fase di ordinamento nella compressione riunisce le stringhe simili nel file, perciò i file contenenti simboli ripetuti in grande quantità, come "aabaabaabaab ..." (ripetuto molte centinaia di volte) possono essere compressi in modo più lento della norma. Le versioni 0.9.5 e successive si comportano meglio delle precedenti versioni in questo caso. Il rapporto tra il tempo di compressione del caso peggiore e del caso medio è nella regione dei 10:1. Per le precedenti versioni, questo valore era vicino a 100:1. Si può usare l’opzione −vvvvv per monitorare i progressi con maggior dettaglio.

La velocità di decompressione non è influenzata da questo fenomeno.

bzip2 normalmente alloca alcuni megabyte di memoria per operare e successivamente ci carica tutto sopra in un modo abbastanza casuale. Perciò le prestazioni, sia in compressione che in decompressione, sono largamente influenzate dalla velocità con cui la macchina serve i "cache miss". A causa di questo, piccoli cambiamenti al codice per ridurre il "miss rate" hanno fatto osservare sproporzionati miglioramenti nelle prestazioni. Immagino che bzip2 funzioni meglio sulle macchine con cache molto grandi.

AVVERTENZE

I messaggi di errore di I/O non aiutano quanto dovrebbero. bzip2 tenta duramente di individuare gli errori di I/O e uscirne bene, ma i dettagli sul problema verificatosi spesso non ci sono.

Questa pagina di manuale descrive la versione 0.9.5 di bzip2.

I dati compressi da questa versione sono interamente compatibili con i precedenti rilasci pubblici, versioni 0.1pl2 e 0.9.0, con la seguente eccezione: 0.9.0 e successive possono correttamente decomprimere file compressi concatenati multipli. Invece 0.1pl2 non lo può fare: termina dopo la decompressione del primo file nello stream.

L’espansione dei metacaratteri in Windows 95 e NT non funziona molto bene.

bzip2recover usa interi a 32 bit per rappresentare la posizione dei bit nei file compressi, perciò non si possono manipolare file più lunghi di 512 megabyte. Ciò potrebbe essere facilmente sistemato.

AUTORI

Julian Seward, jseward [AT] acm.org.

http://www.muraroa.demon.co.uk

Le idee utilizzate da bzip2 sono merito delle seguenti persone (almeno): Michael Burrows e David Wheeler (per la trasformazione a ordinamento di blocco), David Wheeler (ancora, per il coder Huffman), Peter Fenwick (per il modello di codifica strutturato nell’originale bzip, e molti raffinamenti) e Alistair Moffat, Radford Neal e Ian Witten (per il codificatore aritmetico nel bzip originale). Sono in debito per il loro aiuto, supporto e consigli. Si veda il manuale nella distribuzione dei sorgenti per collegamenti alla documentazione dei sorgenti. Christian von Roques mi incoraggia a cercare un algoritmo di ordinamento veloce, in modo da velocizzare la compressione. Bela Lubkin mi incoraggia a migliorare le prestazioni del caso-peggiore durante la compressione. Molte persone hanno mandato pezze, aiutato con i problemi di portabilità, macchine prestate, consigli dati e loro aiuti in generale.