Comment dire à gzip de conserver le fichier original?

210

J'aimerais compresser un fichier texte à l'aide de l'outil de ligne de commande gzip tout en conservant le fichier d'origine. Par défaut, en exécutant la commande suivante

gzip file.txt

permet de modifier ce fichier et de le renommer file.txt.gz. au lieu de ce comportement, j'aimerais avoir ce nouveau fichier compressé en plus de celui existant file.txt. Pour l'instant, j'utilise la commande suivante pour le faire

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

Cela fonctionne mais je me demande pourquoi il n’existe pas de solution plus simple pour effectuer une tâche aussi commune. Peut-être que j'ai raté l'option de faire ça?

Manuel Selva
la source
3
En effet, gzip compresse le fichier donné et crée un nouveau fichier. La compression consiste à compresser le fichier d'origine et à le remplacer par un nouveau. Votre option "-c" indique explicitement à gzip de l'enregistrer sous un autre nom. Voilà pourquoi cela fonctionne
SHW
@SHW Je n'ai pas compris ton commentaire ...?
Manuel Selva
@ManuelSelva une fois que le fichier d'origine est compressé, ce n'est plus nécessaire, je suppose que c'était la conception.
marguerite
2
Pourquoi gzip / gunzip le fait-il par défaut alors qu’aucun autre outil unix ne le fait me dépasse.
Mateen Ulhaq

Réponses:

247

Pour GNU gzip1.6 ou supérieur, FreeBSD et ses dérivés ou versions récentes, NetBSD, voir la réponse de don_cristi .

Avec n'importe quelle version, vous pouvez utiliser les redirections du shell comme suit:

gzip < file > file.gz

Quand aucun argument n'est fourni, gziplit son entrée standard, la compresse et écrit la version compressée sur sa sortie standard. En prime, lorsque vous utilisez des redirections dans un shell, vous n'avez pas à vous soucier des fichiers appelés "--help"ou "-"(ces derniers étant toujours un problème gzip -c --).

Un autre avantage gzip -c file > file.gzest que si elle filene peut pas être ouverte, la commande échouera sans créer un vide file.gz(ou écraser un existant file.gz) et sans exécuter gzipdu tout.

Une différence significative par rapport à gzip -kcependant est qu’il n’y aura aucune tentative de copier les filemétadonnées de (s) (propriété, autorisations, date de modification, nom du fichier non compressé) dans file.gz.

De plus, s'il file.gzexistait déjà, il la remplacera silencieusement à moins que vous n'ayez activé l' noclobberoption dans votre shell (avec set -o noclobberpar exemple dans les shells POSIX).

Stéphane Chazelas
la source
4
Maintenant, cela répond aux spécificités de la question du PO et répond à la question générale "Comment dire à gzip de conserver le fichier d'origine". Très pratique et plus utile que -c.
codewaggle
8
Notez que les <et> sont supposés être saisis dans la commande et ne représentent pas un espace réservé pour le nom de fichier
Gaurav Gupta
1
Quelle est l' -koption? Impossible de le trouver dans les pages de manuel, par exemple cette version ici linux.die.net/man/1/gzip . En outre, il semble que gzip copie les métadonnées du fichier par défaut.
flow2k
1
@ flow2k, c'est le lien vers la réponse de don_cristi.
Stéphane Chazelas
ah, je le vois sur mes macos mais dommage que ce ne soit ni sur RHEL ni sur Ubuntu. Merci.
flow2k
138

Notez que l' édition récente (juin 2013) "accepte l'option --keep (-k), par souci de cohérence avec des outils tels que xz, lzip et bzip2. Avec cette option, gzip ne supprime plus les fichiers d'entrée nommés lors de la compression ou de la décompression" .gzip-1.6

Extrait de la page de manuel:

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

Donc, à partir de 1.6, vous pouvez utiliser -kou --keepconserver le fichier original:

gzip -k -- "$file"

(notez que cela ne fonctionne pas si $fileest -(ce qui gzipinterprète en tant que stdin au lieu du fichier appelé -), auquel cas vous devez le changer en ./-)

Cette option a été introduite pour la première fois dans l’implémentation degzip FreeBSD (dans FreeBSD 7.0 en 2007) par souci de cohérence avec bzip2. Ceci gzipest basé sur une réécriture de GNU gzippar NetBSD. L’ -koption a finalement été rendue à NetBSD en 2010 .

don_crissti
la source
10
Décidément. RHEL6 est livré uniquement avec le zip 1.3.12 dans la base ...
Nicholas Tolley Cottrell
Cela fonctionne sur Mac / OS X :) (qui est BSD)
paul
Y a-t-il beaucoup de distributions standard n'utilisant plus> = 1.6? Je me demande si la réponse doit être mise à jour
MichaelChirico
A quoi sert "-"? Je pense que gzip -k "fichier" fonctionne bien.
Notilas
3
@notilas voir unix.stackexchange.com/q/11376/22142
don_crissti le
30

D'après la documentation, il semble qu'il n'y ait pas d'option pour créer une copie du fichier.

Vous pouvez définir une fonction shell

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

puis

gzipkeep file.txt
Matteo
la source
2
Notez que si le fichier est -, vous devez l'appeler comme gzipkeep ./-.
Stéphane Chazelas