Sto cercando di comprimere una cartella in unix. È possibile farlo utilizzando il comando gzip?
Commenti
Risposta
No.
A differenza di zip
, gzip
funziona come un algoritmo di compressione solo .
A causa di vari motivi, alcuni dei quali risalgono allera delle unità a nastro, Unix utilizza un programma chiamato tar
per archiviare i dati, che possono quindi essere compressi con un programma di compressione come gzip
, bzip2
, 7zip
e così via
In per “comprimere” una directory, il comando corretto sarebbe
tar -zcvf archive.tar.gz directory/
Questo indicherà tar
a
-
comprimilo utilizzando lalgoritmo z (gzip)
-
c (crea) un archivio dai file in
directory
(tar
è ricorsivo per impostazione predefinita) -
v (verbalmente) elenco (su / dev / stderr quindi non influisce sui comandi in pipe) su tutti i file che aggiunge allarchivio.
-
e salva loutput come f (file) denominato
archive.tar.gz
Il comando tar
offre supporto gzip
(tramite il flag -z
) esclusivamente per tua comodità . Il gzip
comando / lib è completamente separato. Il comando precedente è effettivamente lo stesso di
tar -cv directory | gzip > archive.tar.gz
Per decomprimere e decomprimere larchivio nella directory corrente dovresti utilizzare
tar -zxvf archive.tar.gz
Questo comando è effettivamente lo stesso di
gunzip < archive.tar.gz | tar -xv
tar
ne ha molti, molte, MOLTE altre opzioni e usi pure; Consiglio vivamente di leggere la sua manpage qualche volta.
Commenti
- Giusto per rendere le cose ancora più esplicite, questo è esattamente equivalente a
tar -cv directory | gzip > archive.tar.gz
. Larchivio risultante può quindi essere estratto contar -zxvf
o anchezcat file.tar.gz | tar -xv
. Il punto è che tar è completamente indipendente da gzip, il comandotar
include solo il supporto gzip per comodità. - ho utilizzato
tar cvzf
per un bel po . una cosa da notare: se utilizzi Windows (7-zip
da specificare) per decomprimere un file*.tar.gz
, sono necessari due round. Uno per decomprimere il file*.tar.gz
in un file*.tar
, il successivo per decomprimere quel file tar nel contenuto originale. aumenta il tempo totale di decompressione, specialmente per file di grandi dimensioni (es. log) - La denominazione dellarchivio influisce su qualcosa dal punto di vista della macchina? So che sarebbe bello far sapere alle persone lalgoritmo originariamente utilizzato per comprimerlo (da qui .gz), ma a parte questo è davvero importante come si chiama larchivio?
- @ hello_there_andy Non fa differenza rispetto alla maggior parte degli Unix, ma Windows (e il completamento con Smart Tab in Linux) farà supposizioni in base allestensione del nome del file.
- @vadimkotov Questo potrebbe essere ciò che ‘ re cercando: superuser.com/questions/168749/…
Risposta
Il comando gzip
non comprimerà in modo ricorsivo una directory in un singolo file zip, quando si utilizza -r
interruttore. 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 gzip
comando
$ gzip -r dir1
dopo
$ tree dir1/ dir1/ |-- dir11 | |-- file11.gz | |-- file12.gz | `-- file13.gz |-- file1.gz |-- file2.gz `-- file3.gz
Se “preferisci comprimere la struttura della directory, probabilmente vorrai utilizzare il comando tar
e quindi comprimere il risultato .tar
file.
$ 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 confermarne il 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
Risposta
La risposta alla domanda “Posso comprimere unintera cartella utilizzando gzip [su linux]?” è che puoi utilizzare il programma zip
al posto di gzip, con la sintassi:
zip -r <zip file name> <folder to zip>
Commenti
- @JeffSchaller: questa è una risposta. È gravemente sbagliato (credo), ma è chiaramente una risposta.
- @ize: Sono ‘ sono abbastanza sicuro che il comando che hai pubblicato non lo sia, infatti, usa gzip.
- Punti per usare zip come la domanda posta, molto probabilmente lautore avrebbe voluto sapere che ‘ è possibile FARE LESATTO LA STESSA COSA che faceva su Windows. È triste che la maggior parte delle persone ‘ non voglia pensare così lontano.
- È difficile quando la domanda specifica … “utilizzo di gzip”.
- ‘ voto questa risposta poiché penso che il prodotto (un file zip) sia probabilmente più importante del metodo (utilizzando gzip).
Risposta
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
(!!!) Si prega di testare prima delluso (poiché esiste un “rm -f” che potrebbe potenzialmente rimuovere dati importanti se utilizzato 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.
Commenti
- Per comprimere TUTTI i file in una directory:
find ./* -maxdepth 0 -type d -exec gzipdir {} \;
(fai attenzione al comando find, provalo con-exec echo {}
prima e assicurati di ‘ non catturare ‘ ./’ che comprimerà la directory PARENT, eventualmente interrompendo lintera directory home)
Answer
Consiglio di utilizzare pigz
( implementazione parallela di GZip )
tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz
Commenti
- Anchio lo uso molto (e pixz), ma funziona quando entrano in gioco pipe e redirezione delloutput?
Risposta
Se il tuo tar di linux non supporta lopzione -z
puoi utilizzare quanto segue:
tar -cvf - dir | gzip > dir.tar.gz
Risposta
Per completezza, se desidera tarare il file nel file bac kground, utilizza la risposta di @Shadur “e aggiungi &
alla fine:
tar -zcvf archive.tar.gz directory/ &
gzip -r myfolder
che gzip i file in modo ricorsivo. Allo stesso modo puoi decomprimere i file utilizzandogunzip -r myfolder
che decomprimerà i file in modo ricorsivo. Per ulteriori informazioni,man gzip
tar
; supporta le opzioni di compressione .gzip
è concepito come complemento atar
, non come sostituto.comment
poiché quella non era la risposta alla sua domanda.1
e2
nella cartellaplayground
.gzip -r ./playground
ti darà1.gz
e2.gz
(e non più1
e2
file) nella cartellaplayground
, NON un file compresso con tutto ciò che contiene.