Corso Linux Base – Compressione e Archiviazione file da riga di comando

Viene descritto la compressione e l'estrazione dei file da riga di comando, una panoramica completa sull'utilizzo dei comandi tar, zip, bzip2, gzip, xz e sulla creazione di archivi dati compress

Corso Linux Base – Lezione 7

La compressione viene utilizzata per ridurre la quantità di spazio consumata da un set specifico di dati. La compressione viene comunemente utilizzata per ridurre la quantità di spazio necessario per archiviare un file. Un altro uso comune è quello di ridurre la quantità di dati inviati tramite una connessione di rete.

La compressione funziona sostituendo i modelli ripetitivi nei dati. Supponiamo di avere un romanzo. Alcune parole sono estremamente comuni ma hanno più caratteri, come la parola “the”. Potresti ridurre significativamente le dimensioni del romanzo se dovessi sostituire queste parole e schemi multi carattere comuni con sostituzioni di singoli caratteri. Ad esempio, sostituire “the” con una lettera greca che non è utilizzata altrove nel testo. Gli algoritmi di compressione dei dati sono simili a questo ma più complessi.

La compressione è di due tipi: senza perdita (lossless) e con perdita (lossy). Le cose compresse con un algoritmo lossless possono essere decompresse nella loro forma originale. I dati compressi con un algoritmo lossy non possono essere recuperati. Gli algoritmi di perdita vengono spesso utilizzati per immagini, video e audio in cui la perdita di qualità è impercettibile per l’uomo, irrilevante per il contesto o la perdita vale lo spazio risparmiato o la velocità di trasmissione della rete.

Gli strumenti di archiviazione vengono utilizzati per raggruppare file e directory in un singolo file. Alcuni usi comuni sono backup, raggruppamento del codice sorgente del software e conservazione dei dati. L’archivio e la compressione sono comunemente usati insieme. Alcuni strumenti di archiviazione comprimono anche i loro contenuti per impostazione predefinita. In altri casi la compressione è facoltativa.

Lo strumento più comune per l’archiviazione di file su sistemi Linux è tar. La maggior parte delle distribuzioni Linux viene fornita con la versione GNU di tar, quindi è quella che verrà trattata in questa lezione.

tar da solo gestisce l’archiviazione dei file ma non li comprime. Ci sono molti strumenti di compressione disponibili su Linux. Alcuni comuni senza perdita di dati sono bzip2, gzip e xz. Troverai tutti e tre sulla maggior parte dei sistemi. È possibile che si verifichi un sistema vecchio o molto minimale in cui xz o bzip non sono installati. Se diventi un normale utente Linux, probabilmente incontrerai dei file compressi con tutti e tre questi strumenti.

Tutti e tre usano algoritmi diversi, quindi un file compresso con uno strumento non può essere decompresso da un altro. Se si desidera però un rapporto di compressione elevato, ci vorrà più tempo per comprimere e decomprimere il file. Questo perché una maggiore compressione richiede più lavoro per trovare schemi più complessi. Tutti questi strumenti comprimono i dati ma non possono creare archivi contenenti più file.

Gli strumenti di compressione stand-alone non sono in genere disponibili sui sistemi Windows. Gli strumenti di archiviazione e compressione di Windows sono generalmente raggruppati insieme. Tienilo a mente se hai sistemi Linux e Windows che devono condividere file. I sistemi Linux dispongono anche di tool per la gestione dei file .zip comunemente utilizzati sul sistema Windows. Si chiamano zip e unzip. Questi strumenti non sono installati per impostazione predefinita su tutti i sistemi, quindi se è necessario utilizzarli potrebbe essere necessario installarli. Fortunatamente, si trovano in genere nei repository di pacchetti di tutte le distribuzioni.

Tool di Compressione

La quantità di spazio su disco risparmiata tramite la compressione dei file dipende da alcuni fattori. La natura dei dati che si stanno comprimendo, l’algoritmo utilizzato per comprimere i dati e il livello di compressione. Non tutti gli algoritmi supportano diversi livelli di compressione. Iniziamo con l’impostazione di alcuni file di test da comprimere:

$ mkdir ~/linux_lezione7
$ cd ~/linux_lezione7
$ mkdir compression archiving
$ cd compression
$ cat /etc/* > bigfile 2> /dev/null

Ora creiamo tre copie di questo file

$ bzip2 bigfile2
$ gzip bigfile3
$ xz bigfile4
$ ls -lh
total 1.2M
-rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile
-rw-r--r-- 1 emma emma 170K Jun 23 08:08 bigfile2.bz2
-rw-r--r-- 1 emma emma 179K Jun 23 08:08 bigfile3.gz
-rw-r--r-- 1 emma emma 144K Jun 23 08:08 bigfile4.xz

Confronta le dimensioni dei file compressi con il file non compresso denominato bigfile. Notare anche come gli strumenti di compressione hanno aggiunto estensioni ai nomi dei file e rimosso i file non compressi. Usa bunzip2, gunzip o unxz per decomprimere i file:

$ bunzip2 bigfile2.bz2
$ gunzip bigfile3.gz
$ unxz bigfile4.xz
$ ls -lh
total 2.8M
-rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile
-rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile2
-rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile3
-rw-r--r-- 1 emma emma 712K Jun 23 08:20 bigfile4

Si noti di nuovo che ora il file compresso viene eliminato una volta decompresso.

Alcuni strumenti di compressione supportano diversi livelli di compressione. Un livello di compressione più elevato in genere richiede più cicli di memoria e CPU, ma risulta in un file compresso più piccolo. È vero il contrario per un livello inferiore. Di seguito è una dimostrazione con xzgzip:

$ cp bigfile bigfile-gz1
$ cp bigfile bigfile-gz9
$ gzip -1 bigfile-gz1
$ gzip -9 bigfile-gz9
$ cp bigfile bigfile-xz1
$ cp bigfile bigfile-xz9
$ xz -1 bigfile bigfile-xz1
$ xz -9 bigfile bigfile-xz9
$ ls -lh bigfile bigfile-* *
total 3.5M
-rw-r--r-- 1 emma emma 712K Jun 23 08:08 bigfile
-rw-r--r-- 1 emma emma 205K Jun 23 13:14 bigfile-gz1.gz
-rw-r--r-- 1 emma emma 178K Jun 23 13:14 bigfile-gz9.gz
-rw-r--r-- 1 emma emma 156K Jun 23 08:08 bigfile-xz1.xz
-rw-r--r-- 1 emma emma 143K Jun 23 08:08 bigfile-xz9.xz

Non è necessario decomprimere un file ogni volta che lo si utilizza. Gli strumenti di compressione vengono generalmente forniti con versioni speciali di strumenti comuni utilizzati per leggere file di testo. Ad esempio, gzipha una versione di catgrepdifflessmore, e pochi altri. Per gzip, gli strumenti hanno il prefisso a z, mentre il prefisso bzesiste per bzip2ed xzesiste per xz. Di seguito è riportato un esempio dell’utilizzo zcatper leggere visualizzare un file compresso con gzip:

$ cp /etc/hosts ./
$ gzip hosts
$ zcat hosts.gz
127.0.0.1	localhost

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Tool di Archiviazione

Il tarprogramma è probabilmente lo strumento di archiviazione più utilizzato sui sistemi Linux. Nel caso ti stia chiedendo perché è chiamato così com’è, è l’abbreviazione di “archivio nastro”. I file creati con tarsono spesso chiamati tar ball . È molto comune che le applicazioni distribuite come codice sorgente siano in tar ball.

La versione GNU di tarquella distribuzione Linux ha molte opzioni. Questa lezione tratterà il sottoinsieme più comunemente usato.

Iniziamo creando un archivio dei file utilizzati per la compressione:

$ cd ~ / linux_lezione7
$ tar cf archiving/lezione7.tar compression

L’ opzione c indica a tardi creare un nuovo file di archivio e l’ opzione f indica il nome del file da creare. L’argomento immediatamente successivo alle opzioni sarà sempre il nome del file su cui lavorare. Il resto degli argomenti sono i percorsi di qualsiasi file o directory che si desidera aggiungere, elencare o estrarre dal file. Nell’esempio, stiamo aggiungendo la directory compressione tutto il suo contenuto all’archivio.

Per visualizzare il contenuto di una tar ball, utilizzare l’ opzione t di tar:

$ tar -tf lezione7.tar
compression/
compression/bigfile-xz1.xz
compression/bigfile-gz9.gz
compression/hosts.gz
compression/bigfile2
compression/bigfile
compression/bigfile-gz1.gz
compression/bigfile-xz9.xz
compression/bigfile3
compression/bigfile4

Notare come le opzioni sono precedute da -. A differenza della maggior parte dei programmi, con tar, il – non è richiesto quando si specificano le opzioni, anche se non provoca alcun danno se viene utilizzato.

Notare anche come è possibile utilizzare l’opzione -v per consentire a tar di visualizzare i nomi dei file su cui opera durante la creazione o l’estrazione di un archivio.

Ora estraiamo il file

$ cd ~/linux_lezione7/archiving
$ ls
lezione7.tar
$ tar xf lezione7.tar
$ ls
lezione7.tar  compression

Supponiamo di aver bisogno di un solo file dall’archivio. In questo caso, puoi specificarlo dopo il nome del file dell’archivio. È possibile specificare più file, se necessario:

$ cd ~/linux_lezione7/archiving
$ rm -rf compression
$ ls
lezione7.tar
$ tar xvf lezione7.tar compression/hosts.gz
compression/
compression/bigfile-xz1.xz
compression/bigfile-gz9.gz
compression/hosts.gz
compression/bigfile2
compression/bigfile
compression/bigfile-gz1.gz
compression/bigfile-xz9.xz
compression/bigfile3
compression/bigfile4
$ ls
lezione7.tar  compression
$ ls compression
hosts.gz

Ad eccezione dei percorsi assoluti (percorsi che iniziano con /), i file tar conservano l’intero percorso dei file quando vengono creati. Poiché il file lezione7.tar è stato creato con una singola directory, questa stessa directory verrà creata quando viene estratto il file. Un altro esempio dovrebbe chiarire questo:

$ cd ~/linux_lezione7/archiving
$ rm -rf compression
$ cd ../compression
$ tar cf ../tar/lezione7-nodir.tar *
$ cd ../archiving
$ mkdir untar
$ cd untar
$ tar -xf ../lezione7-nodir.tar
$ ls
bigfile   bigfile3  bigfile-gz1.gz  bigfile-xz1.xz  hosts.gz
bigfile2  bigfile4  bigfile-gz9.gz  bigfile-xz9.xz

Il programma tar può anche gestire la compressione e la decompressione degli archivi utilizzando vari algoritmi. tar lo fa chiamando uno dei tool di compressione discussi in precedenza in questa sezione.

Per farlo è semplicemente necessario aggiungere l’opzione appropriata a secondo dell’algoritmo di compressione. I più comunemente usati sono j, J e z che corrispondono rispettivamente a bzip2, xz e gzip, . Vediamo qualche esempio:

$ cd ~/linux_lezione7/compression
$ ls
bigfile   bigfile3  bigfile-gz1.gz  bigfile-xz1.xz  hosts.gz
bigfile2  bigfile4  bigfile-gz9.gz  bigfile-xz9.xz
$ tar -czf gzip.tar.gz bigfile bigfile2 bigfile3
$ tar -cjf bzip2.tar.bz2 bigfile bigfile2 bigfile3
$ tar -cJf xz.tar.xz bigfile bigfile2 bigfile3
$ ls -l | grep tar
-rw-r--r-- 1 emma emma  450202 Jun 27 05:56 bzip2.tar.bz2
-rw-r--r-- 1 emma emma  548656 Jun 27 05:55 gzip.tar.gz
-rw-r--r-- 1 emma emma  147068 Jun 27 05:56 xz.tar.xz

Si noti come nell’esempio i file .tar abbiano dimensioni diverse. Ciò dimostra che sono stati compressi correttamente. Se si creano archivi compressi .tar, è necessario aggiungere sempre una seconda estensione di file che indica l’algoritmo utilizzato. Sono .xz, .bz e .gz per xz, bzip2 e gzip, rispettivamente. A volte vengono utilizzate estensioni abbreviate come .tgz. È possibile aggiungere file ad archivi tar non compressi già esistenti. Usa l’opzione u per farlo. Se si tenta di aggiungere a un archivio compresso, verrà visualizzato un errore.

$ cd ~/linux_lezione7/compression
$ ls
bigfile   bigfile3  bigfile-gz1.gz  bigfile-xz1.xz  bzip2.tar.bz2  hosts.gz
bigfile2  bigfile4  bigfile-gz9.gz  bigfile-xz9.xz  gzip.tar.gz    xz.tar.xz
$ tar cf plain.tar bigfile bigfile2 bigfile3
$ tar tf plain.tar
bigfile
bigfile2
bigfile3
$ tar uf plain.tar bigfile4
$ tar tf plain.tar
bigfile
bigfile2
bigfile3
bigfile4
$ tar uzf gzip.tar.gz bigfile4
tar: Cannot update compressed archives
Try 'tar --help' or 'tar --usage' for more information.

Compressione ed Estrazione File ZIP

Le macchine Windows spesso non hanno applicazioni per gestire file tar o molti dei tool di compressione che si trovano comunemente sui sistemi Linux. Se devi interagire con i sistemi Windows, puoi utilizzare i file ZIP. Un file ZIP è un file di archivio simile a un file tar compresso. I programmi zip e unzip possono essere usati per lavorare con file ZIP su sistemi Linux. L’esempio seguente dovrebbe essere tutto ciò che serve per iniziare a usarli. Per prima cosa creiamo un set di file:

$ cd ~/linux_lezione7
$ mkdir zip
$ cd zip/
$ mkdir dir
$ touch dir/file1 dir/file2

Ora usiamo il comando zip per comprimere questi file in un unico file ZIP:

$ zip -r zipfile.zip dir
  adding: dir/ (stored 0%)
  adding: dir/file1 (stored 0%)
  adding: dir/file2 (stored 0%)
$ rm -rf dir

Adesso scompattiamo il file appena creato:

$ ls
zipfile.zip
$ unzip zipfile.zip
Archive:  zipfile.zip
   creating: dir/
 extracting: dir/file1
 extracting: dir/file2
$ find
.
./zipfile.zip
./dir
./dir/file1
./dir/file2

Quando si aggiungono directory ai file ZIP, l’opzione -r fa sì che zip includa i contenuti di una directory. Senza questa opzione, avresti una directory vuota dentro il file ZIP.

Leave a Reply