Ini tidak bekerja:
# 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>
Ini adalah kondisi lomba:
# 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
Masalahnya adalah bahwa > example.txt
(atau dd of=example.txt
dalam hal ini) membunuh file sebelum proses lain memiliki kesempatan untuk membacanya. Jadi tidak ada solusi yang jelas, itu sebabnya Anda harus tetap berpegang pada mv
.
Ada beberapa cara Anda bisa menipu. Anda dapat membuka file tersebut, kemudian memutuskan tautannya - file tersebut akan terus ada hingga Anda menutupnya - dan kemudian membuat file baru dengan nama yang sama dan menulis data yang di-gzip ke situ. Namun saya tidak tahu cara yang jelas untuk memaksa bash menggunakan itu, dan bahkan jika saya melakukannya, jawaban saya tetap akan:
Jangan lakukan itu.
Jika gzip
gagal karena alasan apa pun, atau masalah apa pun terjadi, seperti Anda kehabisan ruang saat gzipping (karena proses lain sedang menulis, atau hasil gzip lebih besar dari input - yang terjadi untuk data acak - dll.), Anda baru saja kehilangan file Anda . Selamat!
Buat file terpisah dan mv
sukses. Itu adalah metode paling sederhana, mudah dimengerti, dan paling dapat diandalkan yang pernah Anda temukan.