<!doctype linuxdoc system> <article opts="italian"> <!-- Title information --> <title>Bzip2 mini-HOWTO <author>David Fetter, <url url="mailto:david@fetter.org" name="david@fetter.org"> <date>v2.00, 22 agosto 1999 <abstract> Questo documento descrive come usare il nuovo programma di compressione bzip2. Il documento sgml originale è <url url="http://fetter.org/Bzip2-HOWTO/" name="qui">. Traduzione a cura di Gerardo Di Iorio, arete(at)luxna2.na.infn.it, e revisione a cura di Claudio Cattazzo, claudio(at)pluto.it. </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect>Introduzione <p>Bzip2 è un nuovo algoritmo per la compressione dei dati. Generalmente crea file che sono il 60-70% della dimensione dei corrispondenti ottenuti usando gzip. <p>Questo documento vi guiderà attraverso alcune comuni applicazioni per bzip2. <p>Le future versioni di questo documento conterranno applicazioni della libreria C libbzip2 gentilmente scritta dall'autore di bzip2, <url url="mailto:Julian_Seward@muraroa.demon.co.uk" name="Julian Seward">. Il manuale di bzip2, che include le informazioni di basso livello della libreria, può essere trovato <url url="http://www.bzip2.org/bzip2/docs/manual_toc.html" name="qui">. <p>Le future versioni di questo documento potranno includere un riassunto del dibattito su come e se usare bzip2 nel kernel di Linux. <sect1><bf>Cronologia delle revisioni</bf> <sect2>v2.00 <p> Cambiata la sezione <ref id="bzip2-with-less" name="Usare bzip2 con less"> in modo che i file .tar.bzip2 possano essere realmente letti. Grazie a <url url="mailto:mc8644@mclink.it" name="Nicola Fabiano"> per la correzione. <p> Aggiornata l'utilità buzzit. <p> Aggiornate le informazioni su tar. <sect2>v1.92 <p> Aggiornata la sezione <ref id="bzip2-binaries" name="Ottenere i binari di bzip2">, inclusi quelli di S.u.S.E. <sect2>v1.91 <p>Corretto un carattere e chiariti alcuni idiomi della shell <ref id="bzip2-with-tar" name="nella sezione sull'uso di bzip2 con tar">. Grazie per questo ad Alessandro Rubini. <p>Aggiornato lo strumento buzzit in modo da non danneggiare l'archivio originale bzip2. <p>Aggiunto bgrep, uno strumento simile a zgrep. <sect2>v1.9 <p>Chiarito il problema di gcc 2.7.* Grazie a Ulrik Dickow per averlo indicato. <p>Aggiunto l'elegante sistema di Leonard Jean-Marc per lavorare con tar. <p>Aggiunta la traduzione in Svedese di Linus Ãkerlund. <p>Corretta la sezione wu-ftpd con i suggerimenti di Arnaud Launay. <p>Spostate le traduzioni in una loro sezione. <sect2> v1.8 <p>Buzzit e tar.diff sono stati messi nell'sgml a cui appartengono. Corretta la punteggiatura e la formattazione. Grazie a Arnaud Launay per il suo aiuto nella correzione della mia copia. :-) <p>Il progetto xv è stato eliminato per il momento a causa della mancanza di interesse popolare. <p>Aggiunti dei rompicapo per le future versioni del documento. <sect2>v1.7 <p>Aggiunta l'utilità buzzit. Corretta la patch per GNU tar. <sect2>v1.6 <p>Aggiunto il Netscape enabler di TenThumbs. <p>Modificato anche lesspipe.sh secondo i suoi suggerimenti. Adesso dovrebbe funzionare meglio. <sect2>v1.5 <p>Aggiunta la traduzione francese di Arnaud Launay e il suo file per wu-ftpd. <sect2>v1.4 <p>Aggiunta la traduzione giapponese di Tetsu Isaji. <sect2>v1.3 <p> Aggiunto .emacs di Ulrik Dickow per 19.30 e superiori. <p>(Su suo consiglio, corretta anche la patch jka-compr.el per emacs. Oops! Bzip2 non ha ancora(?) un'opzione "append".) <sect2>v1.2 <p>Modificata la patch per emacs così i file .bz2 vengono riconosciuti automaticamente. <sect2>v1.1 <p>Aggiunta patch per emacs. <sect2>v1.0 <p>Prima versione. <sect>Ottenere bzip2<label id="get-bzip2"> <p> La pagina di Bzip2 si trova presso il <url url="http://www.bzip2.org/" name="sito inglese">. Il mirror negli Stati Uniti è <url url="http://www.digistar.com/bzip2/index.html" Name="qui">. <sect1>Bzip2-HOWTO nella propria lingua <p>Coloro che parlano francese potrebbero riferirsi ai documenti in francese di Arnaud Launay. La versione web è <url url="http://www.freenix.fr/linux/HOWTO/mini/Bzip2.html" name="qui"> e si può usare ftp <url url="ftp://ftp.lip6.fr/pub/linux/french/docs/HOWTO/mini/Bzip2.gz" name="qui">. Arnaud può essere contattato attraverso la posta elettronica a <url url="mailto:zoro@mygale.org" name="questo indirizzo">. <p>Chi parla giapponese può far riferimento al documento giapponese di Testsu Isaji <url url="http://jf.gee.kyoto-u.ac.jp/JF/JF.html" name="qui">. Isaji può essere contattato attraverso la <url url="http://www2s.biglobe.ne.jp/~kaien/" name="sua pagina"> o attraverso la posta elettronica a <url url="mailto:isaji@mxu.meshnet.or.jp" name="questo indirizzo."> <p>Chi parla svedese può far riferimento ai documenti in svedese di Linus Ãkerlund <url url="http://user.tninet.se/~uxm165t/linux_doc.html" name="qui">. Linus può essere contattato con la posta elettronica a <url url="mailto:uxm165t@tninet.se" name="questo indirizzo."> <sect1>Ottenere i binari precompilati di bzip2<label id="bzip2-binaries"> <p>Vedere i siti. <sect1>Ottenere i sorgenti di bzip2 <p>Sono reperibili dal sito ufficiale (per sapere dove si veda <ref id="get-bzip2" name="Ottenere Bzip2">). <sect1>Compilare bzip2 per la propria macchina <p><bf>Se si ha gcc 2.7.*</bf>, cambiare la riga <tscreen><verb> CFLAGS = -O3 -fomit-frame-pointer -funroll-loops </verb></tscreen> <p>in <tscreen><verb> CFLAGS = -O2 -fomit-frame-pointer </verb></tscreen> <p>ovvero, sostituire la parte -O3 con -O2 e togliere -funroll-loops. Si potrebbe anche voler aggiungere i parametri -m* usati durante la compilazione del kernel (come -m486, ad esempio). <p>La parte più importante consiste nell'evitare -funroll-loops, poiché genera codice errato su molte versioni di gcc 2.7 e codice più lento e grande su tutte le versioni di gcc 2.7. Per gli altri compilatori (lcc, egcs, gcc 2.8.x) vanno bene le opzioni CFLAGS predefinite. <p> Dopo di questo basta eseguire make e installarlo come spiegato nel README. <sect>Usare bzip2 da solo <p>Leggere la pagina di manuale :) <sect>Usare bzip2 con tar<label id="bzip2-with-tar"> <p>Sono elencati di seguito tre modi per usare bzip2 con tar, ovvero: <sect1>Il più facile da impostare <p>Questo metodo non richiede alcuna configurazione. Per estrarre un archivo tar bzip2, foo.tar.bz2, nell'attuale directory, fare <tscreen><verb> /percorso/per/bzip2 -cd foo.tar.bz2 | tar xf - </verb></tscreen> o <tscreen><verb> tar --use-compress-prog=bzip2 xf foo.tar.bz2 </verb></tscreen> <p>Questo metodo funziona ma può essere un po' scomodo da scrivere spesso. <sect1>Facile da impostare, molto facile da usare, nessuna necessità dei privilegi di root <p>Grazie a <url url="mailto:leonard@sct1.is.belgacom.be" name="Leonard Jean-Marc"> per il suggerimento. Grazie anche ad <url url="mailto:rubini@morgana.systemy.it" name="Alessandro Rubini"> per la distinzione tra bash e csh. <p>Nel proprio .bashrc si può mettere una riga simile a questa: <tscreen><verb> alias btar='tar --use-compress-program /usr/local/bin/bzip2 ' </verb></tscreen> <p>Nel proprio .tcshrc o .cshrc, la riga analoga è simile a questa: <tscreen><verb> alias btar 'tar --use-compress-program /usr/local/bin/bzip2' </verb></tscreen> <sect1>Sempre facile da usare, ma necessita di accesso da root <p>Aggiornare la propria versione di tar a quella più nuova di GNU, che attualmente è la 1.13.10. Può essere trovata nel <url url="ftp://alpha.gnu.org/gnu/tar/" name="sito ftp GNU"> o in qualunque mirror. <sect>Usare bzip2 con less<label id="bzip2-with-less"> <p>Per decomprimere al volo file bzip2, ovvero usare "less" senza prima decomprimerli, si può creare un file lesspipe.sh (man less) come questo: <verb> #!/bin/sh # Questo è un preprocessore per 'less'. Viene usato quando questa # variabile d'ambiente esiste: LESSOPEN="|lesspipe.sh %s" case "$1" in *.tar) tar tvvf $1 2>/dev/null ;; # Mostra il contenuto di vari file tar *.tgz) tar tzvvf $1 2>/dev/null ;; # Questo funziona per la versione non modificata di tar: *.tar.bz2) bzip2 -cd $1 $1 2>/dev/null | tar tvvf - ;; # Questo funziona con la versione con patch di tar: # *.tar.bz2) tyvvf $1 2>/dev/null ;; *.tar.gz) tar tzvvf $1 2>/dev/null ;; *.tar.Z) tar tzvvf $1 2>/dev/null ;; *.tar.z) tar tzvvf $1 2>/dev/null ;; *.bz2) bzip2 -dc $1 2>/dev/null ;; # Mostra correttamente i file compressi *.Z) gzip -dc $1 2>/dev/null ;; *.z) gzip -dc $1 2>/dev/null ;; *.gz) gzip -dc $1 2>/dev/null ;; *.zip) unzip -l $1 2>/dev/null ;; *.1|*.2|*.3|*.4|*.5|*.6|*.7|*.8|*.9|*.n|*.man) FILE=`file -L $1` ; # groff src FILE=`echo $FILE | cut -d ' ' -f 2` if [ "$FILE" = "troff" ]; then groff -s -p -t -e -Tascii -mandoc $1 fi ;; *) cat $1 2>/dev/null ;; # *) FILE=`file -L $1` ; # Controlla se è un binario e se lo è lo mostra con 'strings' # FILE1=`echo $FILE | cut -d ' ' -f 2` # FILE2=`echo $FILE | cut -d ' ' -f 3` # if [ "$FILE1" = "Linux/i386" -o "$FILE2" = "Linux/i386" \ # -o "$FILE1" = "ELF" -o "$FILE2" = "ELF" ]; then # strings $1 # fi ;; esac </verb> <sect>Usare bzip2 con emacs <sect1>Cambiare emacs per tutti <p>Ho scritto la seguente patch per jka-compr.el che aggiunge bzip2 all'auto-compression-mode. <p><bf>Avvertenza:</bf> io l'ho solo provata con emacs-20.2 ma non c'è nessuna ragione per credere che un simile approccio non funzioni con altre versioni. <p>Per usarla, <enum> <item>Andare nella directory dei sorgenti emacs-20.2/lisp (oppure dove li si ha estratti con tar) <item>Mettere la seguente patch in un file chiamato jka-compr.el.diff (deve essere l'unico file ;). <item>Fare <tscreen><verb> patch < jka-compr.el.diff </verb></tscreen> <item>Avviare emacs e fare <tscreen><verb> M-x byte-compile-file jka-compr.el </verb></tscreen> <item>Uscire da emacs. <item>Mettere il proprio jka-compr.elc originale in un posto sicuro in caso di bachi. <item>Sostituirlo con il nuovo jka-compr.elc. <item>Buon divertimento! </enum> <verb> --- jka-compr.el Sat Jul 26 17:02:39 1997 +++ jka-compr.el.new Thu Feb 5 17:44:35 1998 @@ -44,7 +44,7 @@ ;; The variable, jka-compr-compression-info-list can be used to ;; customize jka-compr to work with other compression programs. ;; The default value of this variable allows jka-compr to work with -;; Unix compress and gzip. +;; Unix compress and gzip. David Fetter added bzip2 support :) ;; ;; If you are concerned about the stderr output of gzip and other ;; compression/decompression programs showing up in your buffers, you @@ -121,7 +121,9 @@ ;;; I have this defined so that .Z files are assumed to be in unix -;;; compress format; and .gz files, in gzip format. +;;; compress format; and .gz files, in gzip format, and .bz2 files, +;;; in the snappy new bzip2 format from http://www.muraroa.demon.co.uk. +;;; Keep up the good work, people! (defcustom jka-compr-compression-info-list ;;[regexp ;; compr-message compr-prog compr-args @@ -131,6 +133,10 @@ "compressing" "compress" ("-c") "uncompressing" "uncompress" ("-c") nil t] + ["\\.bz2\\'" + "bzip2ing" "bzip2" ("") + "bunzip2ing" "bzip2" ("-d") + nil t] ["\\.tgz\\'" "zipping" "gzip" ("-c" "-q") "unzipping" "gzip" ("-c" "-q" "-d") </verb> <sect1>Modificare emacs per una sola persona <p> Un ringraziamento per questo va a Ulrik Dickow, <url url="mailto:ukdATkampsax.dk" name="ukd@kampsax.dk">, programmatore di sistema presso Kampsax Technology. Per fare in modo di usare bzip2 automaticamente, senza essere un amministratore di sistema, aggiungere ciò che segue nel proprio file .emacs. <verb> ;; Automatic (un)compression on loading/saving files (gzip(1) and similar) ;; We start it in the off state, so that bzip2(1) support can be added. ;; Code thrown together by Ulrik Dickow for ~/.emacs with Emacs 19.34. ;; Should work with many older and newer Emacsen too. No warranty though. ;; (if (fboundp 'auto-compression-mode) ; Emacs 19.30+ (auto-compression-mode 0) (require 'jka-compr) (toggle-auto-compression 0)) ;; Now add bzip2 support and turn auto compression back on. (add-to-list 'jka-compr-compression-info-list ["\\.bz2\\(~\\|\\.~[0-9]+~\\)?\\'" "zipping" "bzip2" () "unzipping" "bzip2" ("-d") nil t]) (toggle-auto-compression 1 t) </verb> <sect>Usare bzip2 con wu-ftpd <p> Ringrazio Arnaud Launay per questo salva banda. Ciò che segue dovrebbe andare in /etc/ftpconversions per comprimere e decomprimere al volo con bzip2. Assicurarsi che i percorsi (come /bin/compress) siano giusti. <verb> :.Z: : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS : : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS :.gz: : :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP : : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP :.bz2: : :/bin/bzip2 -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:BUNZIP2 : : :.bz2:/bin/bzip2 -9 -c %s:T_REG:O_COMPRESS:BZIP2 : : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR : : :.tar.Z:/bin/tar -c -Z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS : : :.tar.gz:/bin/tar -c -z -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP : : :.tar.bz2:/bin/tar -c -y -f - %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+BZIP2 </verb> <sect>Usare bzip2 con grep <p>La seguente utilità, che chiamo bgrep, è una leggera modifica di zgrep che viene distribuito con Linux. La si può utilizzare per poter usare grep con i file senza decomprimerli con bunzip2. <verb> #!/bin/sh # bgrep -- un wrapper del programma grep che decomprime file PATH="/usr/bin:$PATH"; export PATH prog=`echo $0 | sed 's|.*/||'` case "$prog" in *egrep) grep=${EGREP-egrep} ;; *fgrep) grep=${FGREP-fgrep} ;; *) grep=${GREP-grep} ;; esac pat="" while test $# -ne 0; do case "$1" in -e | -f) opt="$opt $1"; shift; pat="$1" if test "$grep" = grep; then # grep è bacato con -e su SVR4 grep=egrep fi;; -*) opt="$opt $1";; *) if test -z "$pat"; then pat="$1" else break; fi;; esac shift done if test -z "$pat"; then echo "Fa il grep di file bzip2" echo "Uso: $prog [opzioni_grep] modello [file]" exit 1 fi list=0 silent=0 op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'` case "$op" in *l*) list=1 esac case "$op" in *h*) silent=1 esac if test $# -eq 0; then bzip2 -cd | $grep $opt "$pat" exit $? fi res=0 for i do if test $list -eq 1; then bzip2 -cdfq "$i" | $grep $opt "$pat" > /dev/null && echo $i r=$? elif test $# -eq 1 -o $silent -eq 1; then bzip2 -cd "$i" | $grep $opt "$pat" r=$? else bzip2 -cd "$i" | $grep $opt "$pat" | sed "s|^|${i}:|" r=$? fi test "$r" -ne 0 && res="$r" done exit $res </verb> <sect>Usare bzip2 con Netscape sotto X <p> tenthumbs@cybernex.net dice: <tscreen> Ho trovato un modo per usare da Linux Netscape bzip2 per Content-Encoding nello stesso modo con cui viene usato gzip. Aggiungere quanto segue a $HOME/.Xdefaults oppure $HOME/.Xresources. <p> Io uso l'opzione -s perché preferisco sacrificare un po' di velocità di decompressione piuttosto che la memoria RAM. Si può togliere questa opzione se non se ne ha bisogno. </tscreen> <verb> Netscape*encodingFilters: \ x-compress : : .Z : uncompress -c \n\ compress : : .Z : uncompress -c \n\ x-gzip : : .z,.gz : gzip -cdq \n\ gzip : : .z,.gz : gzip -cdq \n\ x-bzip2 : : .bz2 : bzip2 -ds \n </verb> <sect>Usare bzip2 per ricomprimere altri formati di compressione <p> Il seguente programma perl prende file compressi in altri formati (.tar.gz, .tgz, .tar.Z e .Z) e li rimpacchetta per una migliore compressione. Il sorgente perl ha tutti i tipi di documentazione su cosa fa e come lo fa. Quest'ultima versione riceve i file come input dalla riga di comando. Senza argomenti da riga di comando tenta di ricomprimere tutti i file contenuti nell'attuale directory. <verb> #!/usr/bin/perl -w ####################################################### # # # Questo programma prende i programmi compressi # # nella directory attuale e li converte nel formato # # bzip2. Gestisce l'etensione .tgz in un modo # # ragionevole, producendo un file .tar.bz2. # # # ####################################################### $counter = 0; $saved_bytes = 0; $totals_file = '/tmp/machine_bzip2_total'; $machine_bzip2_total = 0; @raw = (defined @ARGV)?@ARGV:<*>; foreach(@raw) { next if /^bzip/; next unless /\.(tgz|gz|Z)$/; push @files, $_; } $total = scalar(@files); foreach (@files) { if (/tgz$/) { ($new=$_) =~ s/tgz$/tar.bz2/; } else { ($new=$_) =~ s/\.g?z$/.bz2/i; } $orig_size = (stat $_)[7]; ++$counter; print "Ricompressione $_ ($counter/$total)...\n"; if ((system "gzip -cd $_ |bzip2 >$new") == 0) { $new_size = (stat $new)[7]; $factor = int(100*$new_size/$orig_size+.5); $saved_bytes += $orig_size-$new_size; print "$new è circa il $factor% della dimensione di $_. :",($factor<100)?')':'(',"\n"; unlink $_; } else { print "Arrgghh! È successo qualcosa a $_: $!\n"; } } print "Si sono " , ($saved_bytes>=0)?"guadagnati ":"persi " , abs($saved_bytes) , " byte di spazio :" , ($saved_bytes>=0)?")":"(" , "\n" ; unless (-e '/tmp/machine_bzip2_total') { system ('echo "0" >/tmp/machine_bzip2_total'); system ('chmod', '0666', '/tmp/machine_bzip2_total'); } chomp($machine_bzip2_total = `cat $totals_file`); open TOTAL, ">$totals_file" or die "Impossibile aprire il totale su tutto il sistema: $!"; $machine_bzip2_total += $saved_bytes; print TOTAL $machine_bzip2_total; close TOTAL; print "Sono stati guadagnati un totale di ",`cat $totals_file`," byte su tutta la macchina.\n"; </verb> </article>