Sto cercando di comprimere una cartella in unix. È possibile farlo utilizzando il comando gzip?

Commenti

  • puoi utilizzare gzip -r myfolder che gzip i file in modo ricorsivo. Allo stesso modo puoi decomprimere i file utilizzando gunzip -r myfolder che decomprimerà i file in modo ricorsivo. Per ulteriori informazioni, man gzip
  • Usa tar; supporta le opzioni di compressione . gzip è concepito come complemento a tar, non come sostituto.
  • Tieni presente che @ val0x00ff ‘ quasi certamente non è quello che vuoi ottenere.
  • @Shadur questo ‘ è il motivo per cui lho pubblicato come comment poiché quella non era la risposta alla sua domanda.
  • Per dimostrare il significato di @Shadur. Dati file 1 e 2 nella cartella playground . gzip -r ./playground ti darà 1.gz e 2.gz (e non più 1 e 2 file) nella cartella playground, NON un file compresso con tutto ciò che contiene.

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 con tar -zxvf o anche zcat file.tar.gz | tar -xv. Il punto è che tar è completamente indipendente da gzip, il comando tar 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/ & 

Lascia un commento

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