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

gzip file.txt 

comporta la modifica di questo file e la rinominarlo file.txt.gz. invece di questo comportamento vorrei avere questo nuovo file compresso in addizione 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 unattività così comune? Forse ho perso lopzione per farlo?

Commenti

  • Questo perché gzip comprime il file dato e crea un nuovo file. Compressione significa comprimere il file originale e sostituirlo con uno nuovo. La tua opzione " -c " dice esplicitamente a gzip di salvarlo con un altro nome. Questo ' è il motivo per cui funziona
  • @SHW Non ' ho ricevuto il tuo commento …?
  • @ManuelSelva una volta compresso il file originale, ' non è più necessario, immagino che fosse il design.
  • Perché gzip / gunzip fallo per impostazione predefinita quando nessun altro strumento Unix lo fa è al di là di me.

Risposta

Per GNU gzip 1.6 o successivo, FreeBSD e derivati o versioni recenti di NetBSD, vedi don_cristi “s answer .

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

gzip < file > file.gz 

Quando non forniti qualsiasi argomento, gzip legge il suo standard input, lo comprime e scrive la versione compressa nel suo standard output. Come bonus, quando usi i reindirizzamenti della shell, non devi preoccuparti dei file chiamato "--help" o "-" (questultimo ancora essere un problema per gzip -c --).

Un altro vantaggio rispetto a gzip -c file > file.gz è che se file non può “t essere aperto, il comando fallirà senza creare un file.gz vuoto (o sovrascrivendo un file.gz esistente) e senza eseguire affatto gzip.

Una differenza significativa rispetto a gzip -k è che non ci sarà alcun tentativo di copiando i file “metadati (proprietà, permessi, ora di modifica, nome del file non compresso) in file.gz.

Inoltre, se file.gz esiste già, lo sovrascriverà silenziosamente a meno che tu non abbia attivato lopzione noclobber nella tua shell (con set -o noclobber per esempio nelle shell POSIX).

Commenti

  • Ora questo affronta le specifiche dellOP ' s domanda e risponde alla domanda ge domanda nerale " Come dire a gzip di conservare il file originale ". Molto utile e più utile di -c.
  • Tieni presente che < e > dovrebbero effettivamente essere digitati nel comando e non rappresentano un segnaposto per il nome del file
  • Cosa ' è il -k opzione? Impossibile ' trovarlo nelle pagine man, ad es. questa versione qui linux.die.net/man/1/gzip . Inoltre, sembra che gzip copi i metadati del file ' per impostazione predefinita.
  • @ flow2k, che ' s il link alla risposta di don_cristi '.
  • @St é phaneChazelas Funziona anche su gzip versione 1.4. cat file | gzip > file.gz

Risposta

Tieni presente che di recente (giugno 2013 ) rilasciato gzip-1.6 " accetta il –keep Opzione (-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 di " .

Estratto dalla pagina man:

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

Quindi, a partire da 1.6, puoi utilizzare -k o --keep per mantenere il file originale:

gzip -k -- "$file" 

(tieni presente che “non funziona se $file è - (che gzip interpreta nel senso di stdin invece del file effettivo chiamato -), nel qual caso devi cambiarla in ./-)

Quellopzione era introdotto per la prima volta nellimplementazione di FreeBSD di gzip (in FreeBSD 7.0 nel 2007) per coerenza con bzip2. Quel gzip è basato su una riscrittura di GNU gzip di NetBSD. alla fine è tornata a NetBSD nel 2010 .

Commenti

  • Geez. RHEL6 viene fornito solo con zip 1.3.12 in base …
  • Funziona su Mac / OS X 🙂 (che è BSD)
  • Ci sono molte distribuzioni standard che non usano > = 1.6 più? Ti chiedi se la risposta necessita di un aggiornamento
  • A cosa serve " – "? Penso che gzip -k " file " funzioni bene.
  • @notilas vedi unix.stackexchange.com/q/11376/22142

Risposta

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

Puoi definire una funzione di shell

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

e poi

gzipkeep file.txt 

Commenti

  • Tieni presente che se il file è -, devi chiamarlo come gzipkeep ./-.
  • Questa è la migliore soluzione per gli script IMO, poiché puoi essere sicuro che il file di output > "$1.gz" esisterà esattamente come specificato. Inoltre, puoi anche specificare un nome diverso se necessario.

Lascia un commento

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