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?
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).
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 .
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