Isso NÃO 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 é uma condição de corrida:
# 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
O problema é que > example.txt
(ou dd of=example.txt
) mata o arquivo antes que o outro processo tenha a chance de lê-lo. Portanto, não há solução óbvia, e é por isso que você deve ficar com mv
.
Existem várias maneiras de enganar você. Você pode abrir o arquivo, depois desvinculá-lo - o arquivo continuará existindo até você fechá-lo - e então criar um novo arquivo com o mesmo nome e gravar os dados compactados nele. No entanto, eu não conheço uma maneira óbvia de coagir o bash a usar isso, e mesmo se o fizesse, minha resposta ainda seria:
Nem faça isso.
Se gzip
falhar por algum motivo, ou ocorrer algum problema, como você ficar sem espaço enquanto gzipping (porque outros processos estão gravando ou o resultado gzip é maior que a entrada - que acontece para dados aleatórios - etc.) , você acabou de perder seu arquivo. Parabéns!
Crie um arquivo separado e mv
no sucesso. Esse é o método mais simples, fácil de entender e mais confiável que você encontrará.