Esto no funciona:
# 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>
Esta es una condición de carrera:
# 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
El problema es que el > example.txt
(o dd of=example.txt
para el caso) mata el archivo antes de que el otro proceso tenga la oportunidad de leerlo. Por lo tanto, no hay una solución obvia, razón por la cual debe seguir mv
.
Hay varias formas de hacer trampa. Puede abrir el archivo, luego desvincularlo (el archivo continuará existiendo hasta que lo cierre) y luego crear un nuevo archivo con el mismo nombre y escribir los datos comprimidos en él. Sin embargo, no conozco una forma obvia de obligar a bash a usar eso, e incluso si lo supiera, mi respuesta sería:
Ni siquiera lo hagas.
Si gzip
falla por algún motivo, o se produce algún problema, como que se está quedando sin espacio mientras se comprime (porque otros procesos están escribiendo, o el resultado de gzip es mayor que la entrada, que ocurre con datos aleatorios, etc.), acaba de perder su archivo . ¡Felicidades!
Cree un archivo separado y mv
en caso de éxito. Ese es el método más simple, fácil de entender y más confiable que jamás encontrará.