Come dire a gzip di conservare il file originale?


210

Vorrei comprimere un file di testo utilizzando lo strumento da riga di comando gzip mantenendo il file originale. Per impostazione predefinita, eseguire il comando seguente

gzip file.txt

comporta la modifica di questo file e la ridenominazione file.txt.gz. invece di questo comportamento, vorrei avere questo nuovo file compresso oltre a quello esistente file.txt. Per ora sto usando il seguente comando per farlo

gzip -c file.txt > file.txt.gz

Funziona ma mi chiedo perché non esiste una soluzione più semplice per svolgere un compito così comune? Forse ho perso l'opzione farlo?


3
Questo perché gzip comprime il file specificato e crea un nuovo file. Compressione significa comprimere il file originale e sostituirlo con uno nuovo. L'opzione "-c" dice esplicitamente a gzip di salvarlo con un altro nome. Ecco perché funziona
SHW,

@SHW Non ho ricevuto il tuo commento ...?
Manuel Selva,

@ManuelSelva una volta compresso il file originale, non è più necessario, suppongo che fosse il design.
margherita,

2
Perché gzip / gunzip fa questo di default quando nessun altro strumento unix fa questo è al di là di me.
Mateen Ulhaq,

Risposte:


247

Per GNU gzip1.6 o versioni successive, FreeBSD e derivati ​​o versioni recenti di NetBSD, vedere la risposta di don_cristi .

Con qualsiasi versione, è possibile utilizzare i reindirizzamenti della shell come in:

gzip < file > file.gz

Quando non viene fornito alcun argomento, gziplegge il suo input standard, lo comprime e scrive la versione compressa nel suo output standard. Come bonus, quando usi i reindirizzamenti della shell, non devi preoccuparti dei file chiamati "--help"o "-"(quest'ultimo è ancora un problema gzip -c --).

Un altro vantaggio gzip -c file > file.gzè che se filenon può essere aperto, il comando fallirà senza creare un vuoto file.gz(o sovrascrivere uno esistente file.gz) e senza eseguirlo gzipaffatto.

Una differenza significativa rispetto a gzip -kperò è che non ci sarà alcun tentativo di copiare filei metadati (proprietà, autorizzazioni, tempo di modifica, nome del file non compresso) in file.gz.

Inoltre, se file.gzgià esistente, lo sovrascriverà silenziosamente a meno che tu non abbia attivato l' noclobberopzione nella tua shell (con set -o noclobberad esempio nelle shell POSIX).


4
Ora questo affronta le specifiche della domanda del PO e risponde alla domanda generale "Come dire a gzip di conservare il file originale". Molto utile e più utile di -c.
codewaggle

8
Si noti che <e> in realtà dovrebbero essere digitati nel comando e non rappresentano un segnaposto per il nome file
Gaurav Gupta,

Qual è l' -kopzione? Non è stato possibile trovarlo nelle pagine man, ad esempio questa versione qui linux.die.net/man/1/gzip . Inoltre, sembra che gzip copi i metadati del file per impostazione predefinita.
flow2k

1
@ flow2k, questo è il link alla risposta di don_cristi.
Stéphane Chazelas,

ah, lo vedo sui miei macos ma peccato che non sia su RHEL né su Ubuntu. Grazie.
flow2k,

138

Si noti che la versione recente (giugno 2013) "accetta l'opzione --keep (-k), per coerenza con strumenti come xz, lzip e bzip2. Con questa opzione, gzip non rimuove più i file di input con nome durante la compressione o la decompressione" .gzip-1.6

Estratto dalla pagina man:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

Quindi, a partire da 1.6, puoi usare -ko --keepper mantenere il file originale:

gzip -k -- "$file"

(nota che non funziona se $fileè -(che gzipinterpreta come significato stdin invece del file effettivo chiamato -), nel qual caso, devi cambiarlo in ./-)

Questa opzione è stata introdotta per la prima volta nell'implementazione di FreeBSD digzip (in FreeBSD 7.0 nel 2007) per coerenza con bzip2. Questo gzipsi basa su una riscrittura di GNU gzipda parte di NetBSD. L' -kopzione alla fine è tornata su NetBSD nel 2010 .


10
Accidenti. RHEL6 viene fornito solo con zip 1.3.12 nella base ...
Nicholas Tolley Cottrell,

Funziona su Mac / OS X :) (che è BSD)
paul

Ci sono molte distro standard che non usano più> = 1.6? Mi chiedo se la risposta debba essere
aggiornata

A cosa serve "-"? Penso che gzip -k "file" funzioni bene.
notilas,


30

Dalla documentazione sembra che non ci sia alcuna opzione per creare una copia del file.

È possibile definire una funzione shell

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

e poi

gzipkeep file.txt

2
Nota che se il file è -, devi chiamarlo come gzipkeep ./-.
Stéphane Chazelas,
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.