Je voudrais compresser un fichier texte à laide de loutil de ligne de commande gzip tout en en conservant le fichier dorigine. Par défaut, lexécution de la commande suivante

gzip file.txt 

entraîne la modification de ce fichier et le renommer file.txt.gz. au lieu de ce comportement, je voudrais avoir ce nouveau fichier compressé dans addition à celui existant file.txt. Pour linstant, jutilise la commande suivante pour faire cela

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

Cela fonctionne mais je me demande pourquoi il ny a pas de solution plus simple pour faire une tâche aussi courante? Peut-être ai-je manqué cette option?

Commentaires

  • Cest parce que gzip compresse le fichier donné et crée un nouveau fichier. La compression signifie presser le fichier original et le remplacer par un nouveau. Votre option " -c " indique explicitement à gzip de lenregistrer sous un autre nom. Cest ' pourquoi ça marche
  • @SHW Je nai ' obtenir votre commentaire …?
  • @ManuelSelva une fois que le fichier original est compressé, il ' nest plus nécessaire, je suppose que cétait la conception.
  • Pourquoi gzip / gunzip faites ceci par défaut quand aucun autre outil Unix ne le fait ne me dépasse.

Réponse

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

Avec nimporte quelle version, vous pouvez utiliser des redirections shell comme dans:

gzip < file > file.gz 

Lorsquelles ne sont pas fournies nimporte quel 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 navez pas à vous soucier des fichiers appelé "--help" ou "-" (ce dernier encore étant 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 quil ny aura aucune tentative copie des métadonnées de file « (propriété, autorisations, heure de modification, nom du fichier non compressé) vers file.gz.

De plus, si file.gz existait déjà, il le remplacera silencieusement sauf si vous avez activé loption noclobber dans votre shell (avec set -o noclobber par exemple dans les shells POSIX).

Commentaires

  • Maintenant, cela répond aux spécificités de lOP ' s question et répond au ge question générale " Comment dire à gzip de conserver le fichier original ". Très pratique et plus utile que -c.
  • Notez que < et > sont en fait censés être saisis dans la commande et ne représentent pas un espace réservé pour le nom de fichier
  • Quest-ce que ' est le -k option? Impossible de le trouver ' dans les pages de manuel, par exemple cette version ici linux.die.net/man/1/gzip . De plus, il semble que gzip copie les métadonnées du fichier ' par défaut.
  • @ flow2k, que ' s le lien vers la réponse de don_cristi '.
  • @St é phaneChazelas Travaille également sur gzip version 1.4. cat file | gzip > file.gz

Réponse

Notez que récemment (juin 2013 ) libéré gzip-1.6 " accepte le –keep (-k), par souci de cohérence avec des outils comme xz, lzip et bzip2. Avec cette option, gzip ne supprime plus les fichiers dentrée nommés lors de la compression ou de la décompression de " .

Extrait de la page de manuel:

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

Ainsi, à partir de 1.6, vous pouvez utiliser -k ou --keep pour conserver le fichier dorigine:

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 changer en ./-)

Cette option était introduit pour la première fois dans limplémentation FreeBSD de gzip (dans FreeBSD 7.0 en 2007) par souci de cohérence avec bzip2. Ce gzip est basé sur une réécriture de GNU gzip par NetBSD. Le -k est finalement revenu à NetBSD en 2010 .

Commentaires

  • Décidément. RHEL6 nest livré quavec le zip 1.3.12 dans la base …
  • Cela fonctionne sur Mac / OS X 🙂 (qui est BSD)
  • Y a-t-il de nombreuses distributions standard nutilisant pas > = 1.6 plus? Vous vous demandez si la réponse doit être mise à jour
  • À quoi sert " – "? Je pense que gzip -k " file " fonctionne bien.
  • @notilas voir unix.stackexchange.com/q/11376/22142

Réponse

Daprès la documentation, il semble quil ny ait pas doption 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 

Commentaires

  • Notez que si le fichier est -, vous devez lappeler gzipkeep ./-.
  • Cest la meilleure solution pour les scripts IMO, car vous pouvez être sûr que le fichier de sortie > "$1.gz" existera exactement comme spécifié. De plus, vous pouvez également spécifier un nom différent si le besoin sen fait sentir.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *