Это не работает:
# 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>
Это условие гонки:
# 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
Проблема в том, что > example.txt
(или dd of=example.txt
в этом отношении) убивает файл, прежде чем другой процесс сможет его прочитать. Так что нет очевидного решения, поэтому вы должны придерживаться mv
.
Есть несколько способов обмануть. Вы можете открыть файл, затем отсоединить его - файл будет существовать до тех пор, пока вы его не закроете, - а затем создать новый файл с тем же именем и записать в него сжатые данные. Однако я не знаю очевидного способа заставить bash использовать это, и даже если бы я знал, мой ответ все равно будет:
Даже не делай этого.
Если gzip
по какой-либо причине происходит сбой или возникает какая-либо проблема, например, когда у вас не хватает места во время gzipping (потому что другие процессы пишут, или результат gzip больше, чем ввод - что происходит для случайных данных - и т. Д.), Вы просто потеряли свой файл , Поздравляем!
Создайте отдельный файл и mv
в случае успеха. Это самый простой, легкий для понимания и самый надежный метод, который вы когда-либо найдете.