Comando zip: comprimere cartelle, estrarre con unzip e opzioni di compressione

Ambiente di testFamiglia RHELAlmaLinux 9.8account rootVerificato il 2026-11-05
Comandi di compressione · archiviazionezipunzipPosizione/usr/bin/zip
Comprimere cartelle ed estrarre con unzip

Il comando zip raccoglie su Linux file e cartelle in un unico file zip compresso, e per estrarlo si usa unzip insieme a lui. Su un server AlmaLinux 9, comprimendo con zip -r la cartella di un sito web si è passati da 35.825 byte a 4.158 byte, e unzip -O ha corretto i nomi di file illeggibili di un file zip creato su Windows.

L'output qui sotto proviene da una cartella di lavoro su un server AlmaLinux 9.8, eseguito come root, con orari in UTC. La cartella site e i file di note compressi sono file di esempio creati per il test. Lo zip creato su Windows è stato riprodotto con un file di prova i cui nomi di file sono salvati in CP949.

1️⃣ Come usare il comando zip

  • ↪️ Comprimere file e cartelle (-r)

Dopo zip scrivi prima il nome del nuovo file zip e poi elenca i file da metterci dentro. Il comando qui sotto comprime due file, readme.txt e memo.txt, in un unico notes.zip.

zip notes.zip readme.txt memo.txt
  adding: readme.txt (deflated 92%)
  adding: memo.txt (stored 0%)

Il [deflated 92%] a fine riga indica di quanto si è ridotto il file rispetto alla dimensione originale. Lo [stored 0%] sulla riga di memo.txt, da 71 byte, significa che il file è stato salvato alla dimensione originale, senza compressione.

Per comprimere una cartella aggiungi -r. Se scrivi solo il nome della cartella senza -r, nell'archivio entra solo la voce della cartella site/ e non i file che contiene.

zip nodir.zip site
  adding: site/ (stored 0%)

La cartella site da comprimere ha tre sottocartelle e sei file, come mostrato sotto.

site/
css/
style.css
js/
app.js
logs/
access.log
index.html
about.html
.htaccess

Con -r entrano tutte e dieci le voci: le sottocartelle, i file al loro interno e perfino .htaccess, il cui nome inizia con un punto.

zip -r site.zip site
  adding: site/ (stored 0%)
  adding: site/css/ (stored 0%)
  adding: site/css/style.css (deflated 93%)
  adding: site/js/ (stored 0%)
  adding: site/js/app.js (deflated 87%)
  adding: site/logs/ (stored 0%)
  adding: site/logs/access.log (deflated 94%)
  adding: site/index.html (deflated 91%)
  adding: site/about.html (deflated 87%)
  adding: site/.htaccess (deflated 9%)

Per vedere cosa contiene un file zip finito senza estrarlo, usa unzip -l. I file salvati sommavano 35.825 byte, e ls -l mostrava site.zip di 4.158 byte.

unzip -l site.zip
Archive:  site.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  10-28-2026 22:10   site/
        0  10-28-2026 22:10   site/css/
     4431  10-28-2026 22:10   site/css/style.css
        0  10-28-2026 22:10   site/js/
     1882  10-28-2026 22:10   site/js/app.js
        0  10-28-2026 22:10   site/logs/
    24134  10-28-2026 22:10   site/logs/access.log
     3723  10-28-2026 22:10   site/index.html
     1612  10-28-2026 22:10   site/about.html
       43  10-28-2026 22:10   site/.htaccess
---------                     -------
    35825                     10 files
ls -l site.zip
-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip

2️⃣ Opzioni del comando zip

  • ↪️ -x, -u, -d, livello di compressione, -e

Tra le opzioni del comando zip, -x esclude i file che corrispondono a un pattern. Indicando [site/logs/*] per lasciare fuori la cartella dei log, restano fuori la cartella logs e access.log, ed entrano solo otto voci.

zip -r site-nolog.zip site -x 'site/logs/*'
  adding: site/ (stored 0%)
  adding: site/css/ (stored 0%)
  adding: site/css/style.css (deflated 93%)
  adding: site/js/ (stored 0%)
  adding: site/js/app.js (deflated 87%)
  adding: site/index.html (deflated 91%)
  adding: site/about.html (deflated 87%)
  adding: site/.htaccess (deflated 9%)

Racchiudi il pattern tra apici singoli, così la shell non trasforma prima [*] in nomi di file. Allo stesso scopo, il manuale ufficiale porta un esempio con una barra rovesciata davanti a [*].

-u rimette solo i file cambiati dopo la creazione del file zip. Dopo aver aggiunto una riga alla fine di index.html, eseguendo con -ru viene rimesso solo quel file, come [updating].

zip -ru site.zip site
updating: site/index.html (deflated 90%)

Eseguendo di nuovo lo stesso comando senza file cambiati non è stato stampato nulla, e il codice di uscita era 12. Nel manuale ufficiale, 12 significa che zip non ha nulla da fare.

zip -ru site.zip site; echo $?
12

Per eliminare voci in un file zip usa -d. Indicando [site/logs/*], la voce della cartella logs e access.log vengono eliminate da site.zip.

zip -d site.zip 'site/logs/*'
deleting: site/logs/
deleting: site/logs/access.log

I numeri da -0 a -9 sono il livello di compressione e, secondo il manuale ufficiale, il valore predefinito è -6. La stessa cartella site è stata compressa tre volte con -q, senza output, per confrontare le dimensioni. Poiché durante il test di -u è stata aggiunta una riga a index.html, il totale dei file originali è ora di 35.875 byte.

zip -qr -0 level0.zip site
zip -qr level6.zip site
zip -qr -9 level9.zip site
ls -l level*.zip
-rw-r--r-- 1 root root 37433 Oct 28 23:05 level0.zip
-rw-r--r-- 1 root root  4179 Oct 28 23:05 level6.zip
-rw-r--r-- 1 root root  3874 Oct 28 23:05 level9.zip
Livello di compressioneDimensione del file zipRispetto al totale originale
Totale dei file originali35.875 byte100%
-0 (nessuna compressione)37.433 byte104.3%
-6 (predefinito)4.179 byte11.6%
-9 (compressione massima)3.874 byte10.8%

I 37.433 byte ottenuti con -0 superavano il totale originale di 35.875 byte. È la dimensione dei dati non compressi più 1.558 byte di intestazioni, come nomi di file e orari, aggiunte a ogni voce. -9 è risultato di 305 byte più piccolo del predefinito, e tutta la differenza veniva dal file più grande, access.log.

Per impostare una password aggiungi -e. La password si digita due volte, e i caratteri digitati non compaiono sullo schermo.

zip -e secret.zip memo.txt
Enter password:
Verify password:
  adding: memo.txt (stored 0%)

Anche secret.zip, creato con -e, mostrava con unzip -l nomi, dimensioni e date dei file senza password. Viene cifrato solo il contenuto dei file, quindi non è adatto a materiale di cui vanno nascosti anche i nomi dei file.

unzip -l secret.zip
Archive:  secret.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       71  10-28-2026 22:10   memo.txt
---------                     -------
       71                     1 file

-P, che mette la password direttamente sulla riga di comando, è un'opzione che il manuale ufficiale segnala come non sicura, perché altri utenti dello stesso server possono vedere i comandi in esecuzione. Il manuale descrive anche la cifratura standard di zip stessa come relativamente debole.

Quando estrai uno zip creato con -e, unzip chiede la password per ogni file e, se la inserisci correttamente, quel file viene estratto.

unzip secret.zip -d dec
Archive:  secret.zip
[secret.zip] memo.txt password:
 extracting: dec/memo.txt

📌 Opzioni principali: risultati di questo articolo

OpzioneCompitoRisultato in questo articolo
zip -rInclude tutte le sottocartelle e i file della cartellaSenza -r una riga adding: site/, con -r dieci voci compreso .htaccess
zip -xEsclude i file che corrispondono a un patternEscludendo site/logs/* solo otto voci, senza la cartella logs e access.log
zip -uRimette solo i file cambiati dopo la creazione del file zipUna riga updating: site/index.html (deflated 90%); senza modifiche nessun output e codice di uscita 12
zip -dElimina voci nel file zipdeleting: site/logs/ e deleting: site/logs/access.log
zip -qNasconde le righe mostrate durante la compressioneTutti e tre i comandi compressi con -qr (-0, predefinito, -9) finiscono senza righe adding
zip -0Salva senza comprimerelevel0.zip di 37433 byte, più grande del totale originale
zip -9Comprime il più possibile (predefinito -6)level9.zip 3874 byte, level6.zip creato con il predefinito 4179 byte
zip -eChiede una password e cifra il contenutoChiede Enter password: e Verify password:, poi adding: memo.txt (stored 0%)
unzip -lElenca le voci salvate senza estrarresite.zip con 10 files, 35825 byte in totale
unzip -dIndica la cartella di destinazione e la crea se non esisteInizia con creating: restore/site/ e la struttura della cartella site viene estratta sotto restore
unzip -oSovrascrive tutti i file esistenti senza chiedereCinque righe inflating senza domande
unzip -nSalta i file esistenti senza chiedereDopo la riga Archive: site.zip non compare nulla
unzip -tVerifica i dati compressi senza estrarreOK per ogni voce e No errors detected; il broken.zip troncato dà End-of-central-directory signature not found
unzip -OIndica la codifica dei caratteri dei nomi di file nello zipCon -O CP949 i nomi illeggibili compaiono come 보고서.txt e 견적서.txt ("relazione" e "preventivo" in coreano)
unzip -pInvia il contenuto estratto allo standard output invece di creare fileCompaiono solo le due righe di .htaccess, senza creare file

📎 Altre opzioni: secondo il manuale ufficiale

OpzioneCompito
zip -mElimina i file e le cartelle originali dopo la compressione (li elimina quando il file zip è completo; il manuale ufficiale consiglia di usarla con -T)
zip -jSalva solo i nomi dei file, senza percorsi delle cartelle
zip -ySalva il collegamento simbolico come collegamento invece del file a cui punta
zip -TVerifica il file zip creato e, se la verifica fallisce, lascia invariato lo zip originale
zip -fSostituisce con i file cambiati solo le voci già presenti nello zip, senza aggiungere file nuovi
zip -iInclude solo i file che corrispondono al pattern indicato
zip -PScrive la password direttamente sulla riga di comando (il manuale ufficiale avverte che non è sicuro)
unzip -jEstrae solo i file in una cartella, senza creare la struttura di cartelle dello zip
unzip -xIndica le voci da non estrarre
unzip -qNasconde le righe mostrate durante l'estrazione
unzip -uEstrae solo i file che mancano sul disco e quelli più recenti
unzip -vMostra nell'elenco anche metodo di compressione, dimensione compressa, rapporto e CRC

3️⃣ Come usare il comando unzip

  • ↪️ Estrarre zip su Linux con -d, -o e -n

Per estrarre un file zip su Linux, scrivi il nome del file zip dopo unzip. Senza -d per scegliere la cartella, l'estrazione avviene nella cartella corrente (secondo il manuale ufficiale), perciò questa volta è stata indicata la cartella restore.

unzip site.zip -d restore
Archive:  site.zip
   creating: restore/site/
   creating: restore/site/css/
  inflating: restore/site/css/style.css
   creating: restore/site/js/
  inflating: restore/site/js/app.js
  inflating: restore/site/index.html
  inflating: restore/site/about.html
  inflating: restore/site/.htaccess

Se la cartella indicata con -d non esiste, unzip la crea ed estrae al suo interno la struttura della cartella site così com'è.

Se estrai di nuovo nello stesso punto, unzip si ferma a ogni file già presente e chiede se sovrascriverlo. Scegliendo [N]one, termina senza sovrascrivere nessuno dei file rimanenti.

unzip site.zip -d restore
Archive:  site.zip
replace restore/site/css/style.css? [y]es, [n]o, [A]ll, [N]one, [r]ename: N

Per non avere domande aggiungi -o o -n. -o sovrascrive tutti i file esistenti, -n li salta. Poiché il manuale ufficiale indica -o come opzione pericolosa, verifica prima che la cartella si possa sovrascrivere e solo dopo aggiungi -o.

unzip -o site.zip -d restore
Archive:  site.zip
  inflating: restore/site/css/style.css
  inflating: restore/site/js/app.js
  inflating: restore/site/index.html
  inflating: restore/site/about.html
  inflating: restore/site/.htaccess
unzip -n site.zip -d restore
Archive:  site.zip

Estraendo con -n dove tutti i file esistono già, dopo la riga Archive non compare nulla.

Per estrarre solo una parte di un file zip, scrivi un percorso o un pattern dopo il nome del file zip. Indicando [site/css/*] vengono estratti solo la cartella css e style.css.

unzip site.zip 'site/css/*' -d part
Archive:  site.zip
   creating: part/site/css/
  inflating: part/site/css/style.css

4️⃣ Errori di unzip

  • ↪️ End-of-central-directory e nomi di file illeggibili

Un file zip ricevuto da un altro server va verificato con unzip -t prima di estrarlo. Se i dati compressi non hanno problemi, ogni voce mostra OK e l'ultima riga riporta [No errors detected].

unzip -t site.zip
Archive:  site.zip
    testing: site/                    OK
    testing: site/css/                OK
    testing: site/css/style.css       OK
    testing: site/js/                 OK
    testing: site/js/app.js           OK
    testing: site/index.html          OK
    testing: site/about.html          OK
    testing: site/.htaccess           OK
No errors detected in compressed data of site.zip.

Uno zip la cui parte finale era stata tagliata da un trasferimento interrotto è finito con [End-of-central-directory signature not found]. È il risultato della verifica con -t di un broken.zip che conservava solo i primi 2.000 byte di site.zip, sceso a 2.436 byte dopo l'eliminazione delle voci logs con -d.

unzip -t broken.zip
Archive:  broken.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of broken.zip or
        broken.zip.zip, and cannot find broken.zip.ZIP, period.

unzip legge per prima la lista dei file che si trova proprio alla fine del file zip (il central directory). Per questo non è riuscito a verificare neanche la prima voce di broken.zip, la cui parte finale era tagliata.

Un file che non è uno zip ha dato lo stesso messaggio. Aprendo con unzip site.tar.gz, raggruppato con tar, è finito con lo stesso errore; un file tar.gz si estrae con il comando tar.

unzip site.tar.gz
Archive:  site.tar.gz
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of site.tar.gz or
        site.tar.gz.zip, and cannot find site.tar.gz.ZIP, period.

Un file zip creato su Windows a volte salva i nomi dei file in una codifica di caratteri di Windows invece che in UTF-8. Aprendo con unzip -l su un server UTF-8 report-win.zip, i cui nomi sono salvati in CP949, i nomi dei file sono comparsi come simboli illeggibili.

unzip -l report-win.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   ║╕░э╝н.txt
       17  10-28-2026 22:10   ░▀└√╝н.txt
---------                     -------
       43                     2 files

Se dopo -O scrivi la codifica di caratteri del Windows che ha creato lo zip, i nomi compaiono correttamente, e anche i file estratti con la stessa opzione vengono creati con il nome originale.

unzip -O CP949 -l report-win.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   보고서.txt
       17  10-28-2026 22:10   견적서.txt
---------                     -------
       43                     2 files
unzip -O CP949 report-win.zip -d win
Archive:  report-win.zip
  inflating: win/보고서.txt
  inflating: win/견적서.txt

Secondo la guida di unzip, -O è l'opzione per gli zip creati su DOS o Windows, e -I quella per gli zip creati su altri sistemi.

I messaggi di errore comparsi durante l'estrazione e cosa controllare dopo sono elencati qui sotto.

OutputSignificatoCosa controllare dopo
End-of-central-directory signature not foundLa lista dei file alla fine dello zip non è stata trovata: il file è troncato o non è uno zipConfrontare la dimensione con l'originale e scaricarlo di nuovo · tar.gz con tar
cannot find or openNessun file con quel nome nella cartella correnteNome e posizione del file con ls
skipping: … incorrect passwordPassword sbagliata tre volte, quel file è stato saltato (codice di uscita 82)Maiuscole e minuscole della password e lingua di input
Nomi di file trasformati in simboliNomi salvati in una codifica di caratteri di WindowsQuella codifica (CP949 ecc.) dopo -O

🔲 Simulatore del comando zip

Nel simulatore qui sotto puoi digitare tu stesso i passaggi: comprimere con zip, poi elencare o estrarre con unzip.

Simulatore del comando zipZip 3.0 · UnZip 6.00
[root@server work]#
Funziona solo nel browser e non comprime file reali. I rapporti di compressione sono valori misurati, mentre per i file creati nel simulatore sono valori stimati. Con ↑↓ richiami i comandi digitati prima.

🔢 FAQ & contenuti consigliati

Aprendo con unzip un file .gz compresso con gzip, è finito con [End-of-central-directory signature not found]. Estraendolo con [gzip -d readme.txt.gz], readme.txt.gz è tornato readme.txt. Un .tar.gz, ottenuto raggruppando più file con tar e poi comprimendoli con gzip, si estrae in un colpo solo con tar.

Sul server AlmaLinux 9 verificato, zip e unzip erano comandi installati rispettivamente dai pacchetti zip e unzip. Perciò sui sistemi della famiglia RHEL si installano con [sudo dnf install zip unzip] e su quelli della famiglia Debian con [sudo apt install zip unzip] (secondo l'elenco ufficiale dei pacchetti Debian).

Scrivi dopo unzip -p il file zip e il percorso al suo interno, e il contenuto compare subito sullo schermo. Eseguendo [unzip -p site.zip site/.htaccess] sono comparse solo le due righe di .htaccess, senza creare file.

ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 1   +   3   =