Das funktioniert nicht:
# 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>
Dies ist eine Rennbedingung:
# 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
Das Problem ist, dass der > example.txt
(oder im dd of=example.txt
Übrigen) die Datei beendet, bevor der andere Prozess die Möglichkeit hat, sie zu lesen. Es gibt also keine offensichtliche Lösung, weshalb Sie sich an diese halten sollten mv
.
Es gibt eine Reihe von Möglichkeiten, wie Sie betrügen können. Sie können die Datei öffnen, dann die Verknüpfung aufheben - die Datei bleibt bestehen, bis Sie sie schließen - und dann eine neue Datei mit demselben Namen erstellen und die komprimierten Daten in diese Datei schreiben. Ich kenne jedoch keinen offensichtlichen Weg, Bash dazu zu zwingen, und selbst wenn ich es tun würde, wäre meine Antwort immer noch:
Tu es nicht einmal.
Wenn gzip
aus irgendeinem Grund ein Fehler auftritt oder ein Problem auftritt, z. B. wenn Ihnen beim Gzippen der Speicherplatz ausgeht (weil andere Prozesse schreiben oder das Gzip-Ergebnis größer ist als die Eingabe - was bei zufälligen Daten der Fall ist - usw.), haben Sie einfach Ihre Datei verloren . Herzliche Glückwünsche!
Erstellen Sie eine separate Datei und mv
bei Erfolg. Dies ist die einfachste, verständlichste und zuverlässigste Methode, die Sie jemals finden werden.