Cela ne fonctionne pas:
# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>
Il s'agit d'une condition de concurrence:
# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt
Hello World # may also be empty
Le problème est que le > example.txt
(ou dd of=example.txt
d'ailleurs) tue le fichier avant que l'autre processus ait la chance de le lire. Il n'y a donc pas de solution évidente, c'est pourquoi vous devez vous y tenir mv
.
Il existe plusieurs façons de tricher. Vous pouvez ouvrir le fichier, puis le dissocier - le fichier continuera d'exister jusqu'à ce que vous le fermiez - puis créer un nouveau fichier avec le même nom et y écrire les données compressées. Cependant, je ne connais pas de moyen évident de contraindre bash à l'utiliser, et même si je le faisais, ma réponse serait toujours:
Ne le fais même pas.
Si gzip
échoue pour une raison quelconque ou si un problème survient, comme si vous manquez d'espace pendant le gzipping (parce que d'autres processus sont en train d'écrire ou si le résultat de gzip est plus grand que l'entrée - ce qui se produit pour les données aléatoires - etc.), vous venez de perdre votre fichier . Toutes nos félicitations!
Créez un fichier séparé et mv
en cas de succès. C'est la méthode la plus simple, facile à comprendre et la plus fiable que vous trouverez jamais.