web-dev-qa-db-fra.com

Comment dire à gzip de conserver le fichier d'origine?

Je voudrais compresser un fichier texte en utilisant l'outil de ligne de commande gzip tout en gardant le fichier d'origine. Par défaut, exécuter la commande suivante

gzip file.txt

entraîne la modification de ce fichier et son renommage file.txt.gz. au lieu de ce comportement, j'aimerais avoir ce nouveau fichier compressé dans ajout à 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'y a pas de solution plus simple pour effectuer une tâche aussi courante? Peut-être que j'ai manqué l'option de faire ça?

221
Manuel Selva

Pour GNU gzip 1.6 ou supérieur, FreeBSD et dérivés ou versions récentes de NetBSD, voir réponse de don_cristi .

Avec n'importe quelle version, vous pouvez utiliser les redirections Shell comme dans:

gzip < file > file.gz

Lorsqu'il ne reçoit aucun argument, gzip lit son entrée standard, la compresse et écrit la version compressée dans sa sortie standard. En prime, lorsque vous utilisez des redirections Shell, vous n'avez pas à vous soucier des fichiers appelés "--help" Ou "-" (Ce dernier étant toujours un problème pour gzip -c --).

Un autre avantage par rapport à gzip -c file > file.gz Est que si file ne peut pas être ouvert, la commande échouera sans créer un file.gz Vide (ou écraser un file.gz Existant) et sans exécuter gzip du tout.

Une différence significative par rapport à gzip -k Est cependant qu'il n'y aura aucune tentative de copie des métadonnées de file (propriété, autorisations, heure de modification, nom du fichier non compressé) dans file.gz.

De plus, si file.gz Existait déjà, il le remplacera silencieusement à moins que vous n'ayez activé l'option noclobber dans votre shell (avec set -o noclobber Par exemple dans des shells POSIX).

254
Stéphane Chazelas

Notez que le récent (juin 2013) a publié gzip-1.6 "accepte l'option --keep (-k), pour la cohérence avec des outils comme xz, lzip et bzip2. Avec cette option, gzip ne supprime plus les fichiers d'entrée nommés lors de la compression ou décompresser ".

Extrait de la page de manuel:

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

Donc, à partir du 1.6, vous pouvez utiliser -k ou --keep pour conserver le fichier d'origine:

gzip -k -- "$file"

(notez que cela ne fonctionne pas si $file est - (que gzip interprète comme signifiant stdin au lieu du fichier réel appelé -), auquel cas vous devez le remplacer par ./-)

Cette option était introduite pour la première fois dans l'implémentation FreeBSD de gzip (dans FreeBSD 7.0 en 2007) pour la cohérence avec bzip2. Ce gzip est basé sur une réécriture de GNU gzip par NetBSD. Le -k l'option est finalement revenue à NetBSD en 201 .

149
don_crissti

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
}

et alors

gzipkeep file.txt
30
Matteo