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 comegzipkeep ./-
. - 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.