Posso comprimere un'intera cartella usando gzip?


407

Sto cercando di comprimere una cartella in unix. Questo può essere fatto usando il comando gzip?


6
è possibile utilizzare gzip -r myfolderche gzip file ricorsivamente. Allo stesso modo puoi decomprimere i file usando i gunzip -r myfolder quali decomprimeranno i file in modo ricorsivo. Per ulteriori informazioni, man gzip
Valentin Bajrami,

12
Utilizzare tar; supporta opzioni per la compressione. gzipè concepito come un complemento tar, non come un sostituto.
Devnull

13
Nota che il suggerimento di @ val0x00ff non è quasi certamente quello che vuoi realizzare.
Shadur,

4
@Shadur ecco perché l'ho pubblicato commentperché non era la risposta alla sua domanda.
Valentin Bajrami,

2
Per dimostrare cosa significa @Shadur. File forniti 1e 2nella cartella playground. gzip -r ./playgroundti darà 1.gze 2.gz(e non più 1e 2file) nella cartella playground, NON un file zippato con tutto ciò che contiene.
Jeff Xiao,

Risposte:


660

No.

A differenza zip, gzipfunziona come un algoritmo di compressione solo .

A causa di vari motivi, alcuni dei quali dare ascolto all'epoca di unità a nastro, Unix usa un programma chiamato tarper archiviare i dati, che possono poi essere compresso con un programma di compressione come gzip, bzip2, 7zip, etc.

Per "comprimere" una directory, sarebbe il comando corretto

tar -zcvf archive.tar.gz directory/ 

Questo lo dirà tara

  • comprimilo usando l' algoritmo z (gzip)

  • c (creare) un archivio dai file in directory( tarè ricorsivo per impostazione predefinita)

  • v (verbosely) list (su / dev / stderr in modo che non influisca sui comandi di piping) tutti i file che aggiunge all'archivio.

  • e memorizza l'output come f (file) denominatoarchive.tar.gz

Il tarcomando offre gzipsupporto (tramite la -zbandiera) esclusivamente per comodità dell'utente. Il gzipcomando / lib è completamente separato. Il comando sopra è effettivamente lo stesso di

tar -cv directory | gzip > archive.tar.gz

Per decomprimere e decomprimere l'archivio nella directory corrente che si utilizzerà

tar -zxvf archive.tar.gz

Tale comando è effettivamente lo stesso di

gunzip < archive.tar.gz | tar -xv

tarha molte, molte, MOLTE altre opzioni e usi pure; Consiglio vivamente di leggere la sua pagina man qualche volta.


51
Solo per rendere le cose ancora più esplicite, questo è esattamente equivalente tar -cv directory | gzip > archive.tar.gz. L'archivio risultante può quindi essere estratto con tar -zxvfo anche zcat file.tar.gz | tar -xv. Il punto è che tar è completamente indipendente da gzip, il tarcomando include solo il supporto gzip per comodità.
Patrick,

sto usando tar cvzfda un po 'di tempo. una cosa da notare: se si utilizza Windows ( 7-zipda specificare) per decomprimere un *.tar.gzfile, sono necessari due round. Uno per decomprimere il *.tar.gzfile in un *.tarfile, il successivo per decomprimere quel file tar nel contenuto originale. aumenta il tempo di decompressione totale, in particolare per file di grandi dimensioni (ad esempio registri)
Jeff Xiao

1
La denominazione dell'archivio influisce su qualcosa di intelligente? So che sarebbe bello far sapere alla gente l'algoritmo originariamente utilizzato per comprimerlo (da qui .gz), ma a parte questo è davvero importante come si chiama l'archivio?
hello_there_andy,

3
@hello_there_andy Non fa differenza per la maggior parte degli unix, ma Windows (e il completamento di smart tab in linux) farà ipotesi basate sull'estensione del nome file.
Shadur,

1
@vadimkotov Questo potrebbe essere quello che stai cercando: superuser.com/questions/168749/…
Shadur

47

Il gzipcomando non comprime ricorsivamente una directory in un singolo file zip, quando si utilizza l' -ropzione. Piuttosto percorrerà quella struttura di directory e comprimerà ogni file che trova in un file separato.

Esempio

prima

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

ora esegui il gzipcomando

$ gzip -r dir1

dopo

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

Se si preferisce comprimere la struttura della directory, è probabile che si desideri utilizzare il tarcomando e quindi comprimere il .tarfile risultante .

$ tar zcvf dir1.tar.gz dir1/

Esempio

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

Il risultato è il seguente file singolo:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

Puoi confermare il suo contenuto:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3

4

Ho scritto questi 2 comandi:

gzipdir:

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir:

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!) Provare prima dell'uso (in quanto esiste un 'rm -f' che potrebbe potenzialmente rimuovere dati importanti se usato in modo non comune).

Come usare:

cd /home/; gzipdir MyDirectory o gzipdir /home/MyDirectory

Creerà /home/MyDirectory.tgz e rimuoverà MyDirectory in caso di successo (!!!).

ungzipdir /home/MyDirectory.tgz

Creerà / home / MyDirectory e rimuoverà /home/MyDirectory.tgz in caso di successo.


Per comprimere TUTTI i file in una directory: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (fai attenzione con il comando find, testalo -exec echo {}prima e assicurati di non catturare './' che comprimerà la directory PARENT, eventualmente rompendo tutta la tua home directory)
Andrew Lorien,

1

Consiglio di usare pigz( Implementazione parallela di GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz


Lo uso spesso (e pixz), ma funziona quando entrano in gioco pipe e reindirizzamento dell'output?
Michael Wolf,

1

La risposta alla domanda "Posso comprimere un'intera cartella usando zip su linux?" È usare la sintassi:

zip -r <zip file name> <folder to zip>

Se hai una nuova domanda, chiedila facendo clic sul pulsante Poni domanda . Includi un link a questa domanda se aiuta a fornire un contesto. - Dalla recensione
Jeff Schaller

2
@JeffSchaller: questa è una risposta. È gravemente sbagliato (credo), ma chiaramente è una risposta.
Scott,

1
@ize: Sono abbastanza sicuro che il comando che hai pubblicato, in realtà, non utilizza gzip.
Dhag,

1
Punti per l'utilizzo di zip come la domanda posta, molto probabilmente all'autore sarebbe piaciuto sapere che è possibile FARE LA STESSA COSA ESATTA come faceva su Windows. È triste che la maggior parte delle persone non voglia pensare lontano.
Florian Heigl,

2
È difficile quando la domanda specifica ... "usando gzip".
Jeff Schaller

1

Per completezza, se si desidera tarare il file in background, utilizzare la risposta di @ Shadur e aggiungere &alla fine:

tar -zcvf archive.tar.gz directory/ &

0

Se il tuo tar linux non supporta l' -zopzione puoi usare quanto segue:

tar -cvf - dir | gzip > dir.tar.gz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.