Ich möchte eine Textdatei mit dem Befehlszeilentool gzip komprimieren, während die Originaldatei. Standardmäßig führt das Ausführen des folgenden Befehls

gzip file.txt 

dazu, dass diese Datei geändert und umbenannt wird file.txt.gz. Anstelle dieses Verhaltens möchte ich diese neue komprimierte Datei in zusätzlich zu der vorhandenen . Im Moment verwende ich den folgenden Befehl, um dies zu tun.

gzip -c file.txt > file.txt.gz 

Es funktioniert, aber ich frage mich, warum es keine einfachere Lösung gibt, um eine solche allgemeine Aufgabe auszuführen? Vielleicht habe ich die Option dazu verpasst?

Kommentare

  • Dies liegt daran, dass gzip die angegebene Datei komprimiert und eine neue Datei erstellt. Komprimierung bedeutet, die Originaldatei zu quetschen und durch eine neue zu ersetzen. Ihre Option " -c " weist gzip ausdrücklich an, es unter einem anderen Namen zu speichern. Das ' ist der Grund, warum es funktioniert.
  • @SHW Ich habe ' Ihren Kommentar nicht erhalten …?
  • @ManuelSelva Sobald die Originaldatei komprimiert ist, wird sie ' nicht mehr benötigt. Ich denke, das war das Design.
  • Warum gzip / gunzip Tun Sie dies standardmäßig , wenn kein anderes Unix-Tool dies tut , ist mir ein Rätsel.

Antwort

Für GNU gzip 1.6 oder höher, FreeBSD und Derivate oder neuere Versionen von NetBSD siehe Antwort von don_cristi .

Bei jeder Version können Sie Shell-Umleitungen wie folgt verwenden:

gzip < file > file.gz 

Wenn nicht angegeben Jedes Argument, gzip, liest seine Standardeingabe, komprimiert sie und schreibt die komprimierte Version in ihre Standardausgabe. Als Bonus müssen Sie sich bei der Verwendung von Shell-Umleitungen keine Gedanken über Dateien machen genannt "--help" oder "-" (letzteres noch Dies ist ein Problem für gzip -c --).

Ein weiterer Vorteil gegenüber gzip -c file > file.gz besteht darin, dass wenn file kann nicht geöffnet werden, der Befehl schlägt fehl, ohne ein leeres file.gz zu erstellen (oder ein vorhandenes file.gz zu überschreiben) und ohne gzip überhaupt auszuführen.

Ein signifikanter Unterschied zu gzip -k besteht jedoch darin, dass kein Versuch unternommen wird Kopieren der Metadaten des file (Besitz, Berechtigungen, Änderungszeit, Name der nicht komprimierten Datei) nach file.gz.

Auch wenn file.gz bereits vorhanden ist, wird es stillschweigend überschrieben, es sei denn, Sie haben die Option noclobber in Ihrer Shell aktiviert (mit set -o noclobber zum Beispiel in POSIX-Shells).

Kommentare

  • Dies befasst sich nun mit den Besonderheiten der OP ' s Frage und beantwortet die ge Allgemeine Frage " So weisen Sie gzip an, die Originaldatei " beizubehalten. Sehr praktisch und nützlicher als -c.
  • Beachten Sie, dass < und > sollen eigentlich in den Befehl eingegeben werden und stellen keinen Platzhalter für den Dateinamen dar.
  • Was ' ist die -k Option? ' konnte es nicht in den Manpages finden, z. Diese Version hier linux.die.net/man/1/gzip . Es sieht auch so aus, als würde gzip standardmäßig die Metadaten der Datei ' kopieren.
  • @ flow2k, das ' s Der Link zur Antwort von don_cristi '.
  • @St é phaneChazelas Arbeitet auch an gzip Version 1.4. cat file | gzip > file.gz

Antwort

Beachten Sie, dass die vor kurzem (Juni 2013) ) freigegeben gzip-1.6 " akzeptiert die –keep (-k) Option für Konsistenz mit Tools wie xz, lzip und bzip2. Mit dieser Option entfernt gzip beim Komprimieren oder Dekomprimieren von " keine benannten Eingabedateien mehr.

Auszug aus der Manpage:

 -k --keep Keep (don"t delete) input files during compression or decompression. 

Ab 1.6 können Sie also -k oder --keep So behalten Sie die Originaldatei bei:

gzip -k -- "$file" 

(Beachten Sie, dass dies nicht funktioniert, wenn $file - (was gzip so interpretiert, dass es stdin anstelle der eigentlichen Datei mit dem Namen -). In diesem Fall müssen Sie es in ./-)

ändern. Diese Option war Erstmals eingeführt in der FreeBSD-Implementierung von gzip (in FreeBSD 7.0 im Jahr 2007) aus Gründen der Konsistenz mit bzip2. Diese gzip basiert auf einem Umschreiben von GNU gzip durch NetBSD. Die -k Option schaffte es schließlich zurück zu NetBSD im Jahr 2010 .

Kommentare

  • Meine Güte. RHEL6 wird nur mit zip 1.3.12 in base geliefert …
  • Dies funktioniert unter Mac / OS X 🙂 (das ist BSD)
  • Gibt es viele Standard-Distributionen, die > = 1.6 mehr? Fragen Sie sich, ob die Antwort aktualisiert werden muss
  • Wofür ist " – "? Ich denke, gzip -k " Datei " funktioniert gut.
  • @notilas siehe unix.stackexchange.com/q/11376/22142

Antwort

Aus der Dokumentation geht hervor, dass es keine Möglichkeit gibt, eine Kopie der Datei zu erstellen.

Sie können eine Shell-Funktion definieren.

gzipkeep() { if [ -f "$1" ] ; then gzip -c -- "$1" > "$1.gz" fi } 

und dann

gzipkeep file.txt 

Kommentare

  • Beachten Sie, dass die Datei , Sie müssen es als gzipkeep ./- aufrufen.
  • Dies ist die beste Lösung für Skripte IMO, da Sie sicher sein können, dass die Ausgabedatei > "$1.gz" existiert genau wie angegeben. Darüber hinaus können Sie bei Bedarf auch einen anderen Namen angeben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.