Questo non funziona:
# 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>
Questa è una condizione di gara:
# 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
Il problema è che il > example.txt
(o dd of=example.txt
del resto) uccide il file prima che l'altro processo abbia la possibilità di leggerlo. Quindi non esiste una soluzione ovvia, motivo per cui dovresti attenerti mv
.
Esistono diversi modi per barare. Puoi aprire il file, quindi scollegarlo - il file continuerà a esistere fino a quando non lo chiuderai - e quindi creare un nuovo file con lo stesso nome e scrivere i dati compressi con quello. Comunque non conosco un modo ovvio per costringere Bash a usarlo, e anche se lo facessi, la mia risposta sarebbe ancora:
Non farlo nemmeno.
Se gzip
fallisce per qualsiasi motivo o si verifica un problema, ad esempio quando si esaurisce lo spazio durante il gzipping (perché altri processi stanno scrivendo, o il risultato gzip è più grande dell'input - che accade per dati casuali - ecc.), Hai appena perso il tuo file . Congratulazioni!
Crea un file separato e mv
in caso di successo. Questo è il metodo più semplice, facile da capire e più affidabile che tu abbia mai trovato.