Ich möchte eine gezippte Datei erstellen, die den ursprünglichen Dateinamen beibehält. Zum Beispiel sollte gzipping "example.txt" eine gzippte Datei mit dem Namen "example.txt" anstelle von "example.txt.gz" ausgeben. Ist es möglich, dies elegant mit einem Befehl zu tun (ohne einen nachfolgenden zu tun mv
)?
14
Antworten:
Das funktioniert nicht:
Dies ist eine Rennbedingung:
Das Problem ist, dass der
> example.txt
(oder imdd 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 solltenmv
.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.quelle
gzip example.txt && mv example.txt.gz example.txt
mv
bei Erfolg." kann eleganter gemacht werden? Ich wollte nur vorschlagen, dass die Antwort von frostschutz durch ein konkretes Beispiel ergänzt wird. Wennmv
eleganter verwendet werden kann, als ich dachte, geben Sie bitte ein Beispiel.Ich hatte das gleiche Problem im Rahmen einer CI-Bereitstellung für AWS S3.
Dies ist, was ich getan habe, um ein Verzeichnis (an Ort und Stelle) ohne das
.gz
Suffix rekursiv zu gzippen :Scheint mir sauber genug zu sein. Aber ja, es sieht so aus, als ob Sie
mv
irgendwo eine brauchen .Wenn Sie verwenden, können
grunt
Sie sich anschauengrunt-contrib-compress
. Einige dergrunt
Tools, die speziell für die Bereitstellung auf S3 entwickelt wurden, übernehmen auch gzip für Sie.quelle
find . -type ...
nichtfind.
hinzufügen :)-S
Erweiterung, die Sie möchtenführt zu dog.txt_2015_11
Wenn Sie es entpacken, müssen Sie die Erweiterung angeben.
Verwenden Sie unter Unix den Befehl file, um festzustellen, über welchen Dateityp Sie verfügen, welche Erweiterungen irreführend sind oder häufig fehlen.
quelle
Ich denke nicht, dass das Erstellen einer gzip-Datei ohne Erweiterung wirklich das Richtige ist.
IMHo sollten Sie Ihren Webserver so konfigurieren, dass er die .gz-Datei liest. Sie haben wahrscheinlich bereits eine Regel wie diese:
Sie müssen lediglich eine Regel hinzufügen, die den angeforderten Dateinamen umschreibt, um ".gz" anzufügen (tatsächlich sollten Sie überprüfen, ob die Datei vorhanden ist, genauso wie Sie überprüfen sollten, ob der Client gzip in seinem Accept-Encoding-Header aufgeführt hat).
quelle
Sie können s3_website dafür ausprobieren .
Mir gefällt nicht, dass es sowohl in Scala als auch in Ruby geschrieben ist und eine JVM benötigt. Ich mag auch die Annahme nicht (insbesondere die Tatsache, dass zusätzliche Dateien aus dem Bucket gelöscht werden), aber es sollte funktionieren, wenn Sie damit einverstanden sind.
Ich habe vor, ein solches Tool selbst zu schreiben, das diese Einschränkungen nicht aufweist. Bleiben Sie dran.
quelle
Dies sollten Sie eigentlich nicht tun, vor allem, wenn Sie diese Datei auf andere Systeme oder Personen übertragen, kann dies zu Verwirrung führen und dazu, dass Sie sie nicht als komprimierte Datei finden.
Wenn Sie kein Suffix verwenden möchten, ist GNU nicht gut für Sie, da es a zurückgeben
gzip -S ""
würdegzip: invalid suffix ''
.Sie können jedoch immer so etwas wie
gzip -S " "
(Leerzeichen) senden , und es wird wie folgt angezeigt:Wenn Sie es anschließend dekomprimieren möchten, müssen Sie etwas wie
gunzip -c testfile\
(ohne Angabe des Suffix) oder sogar mit-f
flag ausführen.Ich bin der festen Überzeugung, dass das Hinzufügen eines
mv
Befehls mit&&
nicht zu einem großen Ärger für Ihren Code führen würde. Wie auch immer, und wie @frostschutz gesagt hat, ist es keine wirklich gute Idee, dies zu tun.quelle