Come comprimere o decomprimere file dal terminale Linux

I file ZIP sono un archivio universale comunemente utilizzato su sistemi Windows, macOS e persino Linux. È possibile creare un archivio zip o decomprimere file da uno con alcuni comandi comuni del terminale Linux.

Il formato di file di archivio compresso ZIP

Grazie al predominio del formato ZIP nel regno di Windows, i file ZIP sono probabilmente la forma più comune di archivio compresso al mondo.

Sebbene i file .tar.gz e tar.bz2 siano comuni su Linux, gli utenti Windows probabilmente ti invieranno un archivio in formato ZIP. E, se desideri archiviare alcuni file e inviarli a un utente Windows, il formato ZIP sarà la soluzione più semplice e compatibile per tutti.

zip, unzip e altre utilità

Potresti già sapere che i sistemi operativi Linux e Unix come macOS dispongono di strumenti che ti consentono di creare file ZIP ed estrarre file da essi, chiamati zip e unzip. Ma c’è un’intera famiglia di utilità correlate come zipcloak, zipdetails, zipsplit e zipinfo.

Abbiamo controllato alcune distribuzioni Linux per vedere se includevano queste utilità nell’installazione standard. Tutte le utilità erano presenti in Ubuntu 19.04, 18.10 e 18.04. Erano presenti anche a Manjaro 18.04. Fedora 29 includeva zip e unzip, ma nessuna delle altre utilità e questo era anche il caso di CentOS.

Per installare gli elementi mancanti su Fedora 29, usa il seguente comando:

sudo dnf install perl-IO-Compress

Per installare gli elementi mancanti su CentOS 7, utilizzare il seguente comando:

sudo yum install perl-IO-Compress

Comando di installazione zip in Centos

Se una qualsiasi delle utilità zip non è presente in una distribuzione Linux che non è stata menzionata sopra, utilizzare lo strumento di gestione dei pacchetti della distribuzione Linux per installare il pacchetto richiesto.

Come creare un file ZIP con il comando zip

Per creare un file ZIP, è necessario indicare a zip il nome del file di archivio e quali file includervi. Non è necessario aggiungere l’estensione “.zip” al nome dell’archivio, ma non danneggia se lo fai.

Per creare un file chiamato source_code.zip contenente tutti i file di codice sorgente C e i file di intestazione nella directory corrente, dovresti usare questo comando:

zip source_code *.c *.h

comando zip in una finestra di terminale

Ogni file viene elencato man mano che viene aggiunto. Vengono visualizzati il ​​nome del file e la quantità di compressione ottenuta su quel file.

output dal comando zip in una finestra di terminale

Se guardi il nuovo archivio ZIP, puoi vedere che l’estensione del file “.zip” è stata aggiunta automaticamente da zip.

ls -l source_code.zip

Si trova nell'archivio zip in una finestra di terminale

Se non vuoi vedere l’output da zip mentre viene creato il file ZIP, usa l’opzione -q (quiet).

zip -q source_code *.c *.h

-q opzione silenziosa in una finestra di terminale

Includere le directory nei file ZIP

Per includere sottodirectory nel file ZIP, utilizzare l’opzione -r (ricorsivo) e includere il nome della sottodirectory sulla riga di comando. Per creare un file ZIP come prima e includere anche la sottodirectory dell’archivio, utilizzare questo comando.

zip -r -q source_code archive/ *.c *.h

-r opzione ricorsiva in una finestra di terminale

Per essere rispettoso della persona che estrarrà i file dal file ZIP che stai creando, è spesso educato creare file ZIP con i file al suo interno contenuti in una directory. Quando la persona che riceve il file ZIP lo estrae, tutti i file vengono inseriti ordinatamente in una directory sul proprio computer.

Nel seguente comando, archiviamo la directory di lavoro e tutte le sottodirectory. Notare che questo comando viene emesso dalla directory principale della cartella di lavoro.

zip -r -q source_code work/

zippare la directory di lavoro in una finestra di terminale

Impostazione del livello di compressione

È possibile impostare la quantità di compressione applicata ai file man mano che vengono aggiunti all’archivio ZIP. L’intervallo va da 0 a 9, dove 0 non è affatto compressione. Maggiore è la compressione, maggiore è il tempo necessario per creare il file ZIP. Per i file ZIP di dimensioni modeste, la differenza di orario non è una penalità significativa. Ma poi, per file ZIP di dimensioni modeste, la compressione predefinita (livello 6) è probabilmente abbastanza buona comunque.

Per fare in modo che zip utilizzi un livello specifico di compressione, passare il numero come opzione sulla riga di comando, con un “-“, in questo modo:

zip -0 -r -q source_code work/

-0 opzione di compressione in una finestra di terminale

Il livello di compressione predefinito è 6. Non è necessario fornire l’opzione -6, ma se lo fai non farà alcun danno.

zip -r -q source_code work/

compressione di livello 6 in una finestra di terminale

Il livello di compressione massimo è il livello 9.

zip -9 -r -q source_code work/

-9 compressione in una finestra di terminale

Con la selezione di file e directory archiviati qui, la differenza tra nessuna compressione (livello 0) e la compressione predefinita (livello 6) è 400K. La differenza tra la compressione predefinita e il livello di compressione più alto (livello 9) è solo 4K.

Potrebbe non sembrare molto, ma per archivi contenenti centinaia o addirittura migliaia di file, la piccola quantità di compressione extra per file si aggiungerebbe a un utile risparmio di spazio.

Aggiunta di password ai file ZIP

Aggiungere password ai file ZIP è facile. Usa l’opzione -e (crittografa) e ti verrà chiesto di inserire la tua password e di reinserirla per la verifica.

zip -e -r -q source_code work/

Aggiunta di password ai file zip in una finestra di terminale

Come decomprimere un file ZIP con il comando unzip

Per estrarre i file da un file ZIP, utilizzare il comando unzip e fornire il nome del file ZIP. Tieni presente che devi fornire l’estensione “.zip”.

unzip source_code.zip

il comando unzip in una finestra di terminale

Man mano che i file vengono estratti, vengono elencati nella finestra del terminale.

output di unzip in una finestra di terminale

I file ZIP non contengono dettagli sulla proprietà del file. Tutti i file estratti hanno il proprietario impostato sull’utente che li sta estraendo.

Proprio come zip, unzip ha un’opzione -q (silenziosa), quindi non è necessario vedere l’elenco dei file mentre i file vengono estratti.

unzip -q source_code.zip

unzip -q opzione in una finestra di terminale

Estrazione di file in una directory di destinazione

Per estrarre i file in una directory specifica, utilizzare l’opzione -d (directory) e fornire il percorso della directory in cui si desidera estrarre l’archivio.

unzip -q source_code.zip -d ./development

decomprimere in una directory di destinazione in una finestra di terminale

Estrai file ZIP protetti da password

Se un file ZIP è stato creato con una password, unzip ti chiederà la password. Se non si fornisce la password corretta, unzip non estrarrà i file.

unzip -q source_code.zip

il comando unzip con password in una finestra di terminale

Se non ti interessa che la tua password venga vista da altri, né che venga memorizzata nella cronologia dei comandi, puoi fornire la password sulla riga di comando con l’opzione -P (password). (È necessario utilizzare una “P” maiuscola)

unzip -P fifty.treacle.cutlass -q source_code.zip

decompressione con l'opzione password in una finestra di terminale

Esclusione di file

Se non si desidera estrarre un particolare file o gruppo di file, utilizzare l’opzione -x (escludi). In questo esempio, vogliamo estrarre tutti i file tranne quelli che terminano con un’estensione “.h”.

unzip -q source_code.zip -x *.h

decomprimere l'opzione di esclusione in una finestra di terminale

Sovrascrittura dei file

Supponi di aver estratto un archivio ma di aver eliminato per errore alcuni dei file estratti.

Una soluzione rapida per questo sarebbe estrarre nuovamente i file. Ma se provi a estrarre il file ZIP nella stessa directory di prima, unzip ti chiederà una decisione in merito alla sovrascrittura dei file. Si aspetterà una delle seguenti risposte.

A parte la risposta r (rinomina), queste risposte fanno distinzione tra maiuscole e minuscole.

y: Sì, sovrascrivi questo file
n: No, non sovrascrivere questo file
A: Tutto, sovrascrivi tutti i file
N: Nessuno, non sovrascrivere nessuno dei file
r: Rinomina, estrai questo file ma dagli un nuovo nome. Ti verrà richiesto un nuovo nome.

sovrascrivere i prompt in una finestra di terminale

Per forzare la decompressione per sovrascrivere i file esistenti, utilizzare l’opzione -o (sovrascrittura).

unzip -o -q source_code.zip

opzione di sovrascrittura in una finestra di terminale

Il modo più efficiente per sostituire i file mancanti sarebbe quello di decomprimere solo estrarre tutti i file nell’archivio che non si trovano nella directory di destinazione. Per fare ciò, usa l’opzione -n ​​(mai sovrascrivere).

unzip -n source_code.zip

decomprimere con l'opzione -n ​​non sovrascrivere mai in una finestra di terminale

Guardando dentro un file ZIP

Spesso è utile e istruttivo vedere un elenco dei file all’interno di un file ZIP prima di estrarlo. Puoi farlo con l’opzione -l (archivio elenco). Viene convogliato di meno per rendere gestibile l’output.

unzip -l source_code.zip | less

opzione di decompressione dell'elenco in una finestra di terminale

L’output mostra le directory ei file all’interno del file ZIP, la loro lunghezza e l’ora e la data in cui sono stati aggiunti all’archivio. Premere “q” per uscire da less.

elenca l'output dell'archivio in una finestra di terminale

Ci sono altri modi per sbirciare all’interno di un file ZIP che forniscono diversi tipi di informazioni, come vedremo.

Aggiungi una password con il comando zipcloak

Se hai creato un file ZIP ma hai dimenticato di aggiungere una password, cosa puoi fare? Puoi aggiungere rapidamente una password al file ZIP utilizzando il comando zipcloak. Passa il nome del file ZIP sulla riga di comando. Ti verrà richiesta una password. È necessario verificare la password inserendola una seconda volta.

zipcloak source_code.zip

zipcloak in una finestra di terminale

Visualizza i dettagli del file con il comando zipdetails

Il comando zipdetails ti mostrerà molte informazioni sul file ZIP. L’unico modo sensato per gestire la quantità di output che questo comando può fornire è di convogliarlo attraverso di meno.

zipdetails source_code.zip | less

il comando zipdetails in una finestra di terminale

Notare che le informazioni includeranno i nomi dei file anche se il file ZIP è protetto da password. Questo tipo di informazioni viene memorizzato nel file ZIP come metadati e non fa parte dei dati crittografati.

output di zipdetails in una finestra di terminale

Cerca all’interno del file con il comando zipgrep

Il comando zipgrep ti consente di cercare all’interno dei file in un file ZIP. Nell’esempio seguente, vogliamo sapere quali file all’interno del file ZIP contengono il testo “keyval.h”.

zipgrep keyval.h source_code.zip

il comando zipgrep in una finestra di terminale

Possiamo vedere che i file slang.c e getval.c contengono la stringa “keyval.h”. Possiamo anche vedere che ci sono due copie di ciascuno di questi file in diverse directory nel file ZIP.

Visualizza le informazioni con il comando zipinfo

Il comando zipinfo ti offre un altro modo per guardare all’interno di un file ZIP. Come prima, convogliamo l’output attraverso less.

zipinfo source_code.zip | less

comando zipinfo in una finestra di terminale

Da sinistra a destra l’output mostra:

I permessi dei file
La versione dello strumento utilizzato per creare il file ZIP
La dimensione del file originale
Un descrittore di file (descritto di seguito)
Il metodo di compressione (deflazione, in questo caso)
I dati e il timestamp
Il nome del file e qualsiasi directory

Il descrittore di file è composto da due caratteri. Il primo carattere sarà una “t” o una “b” per indicare un file di testo o binario. Se è una lettera maiuscola il file è crittografato. Il secondo carattere può essere uno dei quattro caratteri. Questo carattere rappresenta il tipo di metadati inclusi per questo file: nessuno, un’intestazione locale estesa, un “campo extra” o entrambi.

-: Se nessuno dei due esiste, il carattere sarà un trattino
l: se è presente un’intestazione locale estesa ma nessun campo aggiuntivo
x: se non è presente un’intestazione locale estesa ma è presente un campo aggiuntivo
X: se è presente un’intestazione locale estesa e c’è un campo aggiuntivo

output zipinfo in una finestra di terminale

Dividi il file con il comando zipsplit

Se è necessario inviare il file ZIP a qualcun altro ma ci sono limitazioni di dimensione o problemi con la trasmissione del file, è possibile utilizzare il comando zipsplit per dividere il file ZIP originale in una serie di file ZIP più piccoli.

L’opzione -n ​​(dimensione) consente di impostare una dimensione massima per ciascuno dei nuovi file ZIP. In questo esempio, suddividiamo il file source_code.zip. Non vogliamo che nessuno dei nuovi file ZIP sia più grande di 100 KB (102400 byte).

zipsplit -n 102400 source_code.zip

il comando zipsplit in una finestra di terminale

La dimensione scelta non può essere inferiore alla dimensione di nessuno dei file nel file ZIP.

Usando questi comandi, puoi creare i tuoi file ZIP, decomprimere i file ZIP ricevuti ed eseguire varie altre operazioni su di essi senza mai lasciare il terminale Linux.