Wie dekomprimiere ich die * .TGZ-Datei, ohne die Originaldatei zu ändern?

3844
nayakam

Mögliches Duplizieren:
Wie packen Sie eine Datei und behalten die GZ-Datei bei?

Ich entpacke die Datei mit folgendem Befehl:

gunzip -f test.TGZ 

Dies gab mir die test.tar-Datei, aber ich habe die test.TGZ-Datei verloren. Gibt es sowieso die Originaldatei zu behalten?

EDIT & Update: Ich rufe die Dekomprimierungsbefehle über ein Java-Programm auf. Die TGZ-Datei enthält mindestens 1 Bilddatei, 1 Textdatei und 1 Videodatei.

Java-Methode: Führen Sie den Befehl aus

private static InputStream executeCommand(String command, File workingDir) throws Exception { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(command, null, workingDir); int exitValue = -1; try { exitValue = process.waitFor(); } catch (InterruptedException ignore) { }  if (exitValue != 0) { InputStream errStream = process.getErrorStream(); String errMessage = null; if (errStream.available() > 0) { byte[] errOutput = new byte[errStream.available()]; errStream.read(errOutput); errMessage = new String(errOutput); }  throw new Exception( "Error in ExtractTGZFileTest.executeCommand(command=\"" + command + "\") - " + errMessage); }  return process.getInputStream(); }  public static void main(String[] args) { try { if (args.length == 2 && args[0].equalsIgnoreCase("tgz")) { String archiveName = args[1]; String tarFilnme = archiveName.substring(0, archiveName .length() - ".tgz".length()) + ".tar"; String gzipCommand = "gzip -c -d " + archiveName + " > " + tarFilnme; InputStream is = ExtractTGZFileTest.executeCommand(gzipCommand, null); } else if (args.length == 2 && args[0].equalsIgnoreCase("tgz1")) { String archiveName = args[1]; String gzipCommand = "gzip --decompress --name --verbose " + archiveName; InputStream is = ExtractTGZFileTest.executeCommand(gzipCommand, null); } else { System.err.println("Usage: command <file1> "); System.exit(1); } System.out.println("DONE"); } catch (Exception ex) { ex.printStackTrace(); System.exit(2); } } 

Lösung: Derzeit kopiere ich die TGZ-Datei an einen temporären Speicherort und arbeite mit dieser Datei.

1
Sieht aus wie ein Beitrag für SuperUser monksy vor 14 Jahren 0
Au contraire (gehört nicht zu SU): Ein relevanter Teil der Handhabung von Open-Source-Programmen ist der Umgang mit komprimierten Tar-Dateien - ein Teil der Programmierung. Jonathan Leffler vor 14 Jahren 5
Wenn wir den Programmierabschnitt wegnehmen, ist dies hier ein Duplikat: http://superuser.com/questions/45650/how-do-you-gunzip-a-file-and-keep-the-gz-file Gnoupi vor 14 Jahren 0

3 Antworten auf die Frage

12
Jonathan Leffler

Benutzen:

gzip -c -d test.tgz > test.tar 

Die Option '-c' bedeutet das Schreiben in die Standardausgabe (anstatt die Eingabedatei zu ändern). Die Option '-d' bedeutet 'dekomprimieren'.

Sie können auch verwenden:

gunzip -c test.tgz > test.tar 

Wenn Sie eine ausreichend moderne Version von GNU 'tar' haben, können Sie einfach Folgendes verwenden:

tar -xf test.tgz 

Wenn Sie eine etwas ältere Version haben, müssen Sie das Komprimierungsprogramm angeben:

tar -xzf test.tgz 

Bei diesen Versionen können Sie auch 'bzip2' verwenden:

tar -xf test.tar.bz2 --use-compress-program=bzip2 

(Bei moderneren Versionen kann mit der Option '-j' eine bzip2-komprimierte TAR-Datei erstellt werden; der Unwrap-Code bestimmt automatisch den richtigen Dekompressor.)

Vielen Dank, ich werde diesen Befehl durch mein Programm versuchen. nayakam vor 14 Jahren 0
für den Befehl "gunzip -c test.tgz> test.tar": Das Programm hängt, wenn versucht wird, den Befehl auszuführen nayakam vor 14 Jahren 0
@Thillakan: Das liegt daran, dass Sie "exec" nicht mit einer Weiterleitung (das Symbol>) aufrufen können. Sie können entweder die Ausgabe des Gunzip-Aufrufs erfassen (mit `popen 'oder selbst Pipes einrichten) oder stattdessen einen der tar-Befehle verwenden. Wenn Sie sich nicht darum kümmern, wann das Programm vorhanden ist, können Sie system ("gunzip -c test.tgz> test.tar") verwenden, da die Systemfunktion das Weiterleitungssymbol akzeptiert. Isak Savo vor 14 Jahren 1
@Isak, danke das Problem zu klären. Ich werde bei meinem derzeitigen Ansatz bleiben. Es ist einfach für mich :). nayakam vor 14 Jahren 0
3
DoctorRuss

Wenn Sie versuchen, eine GZipped-Datei über Java zu dekomprimieren, sollten Sie die Verwendung der Klasse java.util.zip.ZipFile in Betracht ziehen . Wenn Sie dieser Klasse einen Dateiverweis an eine ZIP-Datei übergeben, können Sie Ihre Einträge durchlaufen und als InputStreams darauf zugreifen, wie folgt:

String archiveName = args[1]; ZipFile zf = new ZipFile(archiveName); Enumeration<? extends ZipEntry> entries = zf.entries(); ZipEntry nextElement = entries.nextElement();  InputStream inputStream = zf.getInputStream(nextElement); // use it: read data, serialise back to file, whatever 
Diese Klasse behandelt das PK-Zip-Format, nicht das GZIP-Format. Kevin Panko vor 14 Jahren 0
1
dan

Ich stimme mit Jonathan Leffler überein. Dies ist ein Java-Programmierer, der fragt, wie er mit seinem Java-Programm auf ein komprimiertes Archiv zugreifen kann. Die Tatsache, dass es ein unerfahrener Programmierer ist, der versucht, den falschen Weg (durch das Betriebssystem) zu tun, ändert nichts an der Tatsache, dass dies eine Programmierfrage ist, die zu StackOverflow gehört.

Um die ursprüngliche Frage zu beantworten, schlägt Doctorruss vor, die Verwendung einer Klasse vorzuschlagen. Um auf eine .tar-, .tar.gz- oder .tgz-Datei zuzugreifen, sollten Sie eine Bibliothek verwenden, die auf tar-Archive zugreifen kann. Das Paket com.ice.tar implementiert ein tar-Archiv-Paket, und es ist möglich, dieses Paket mit dem Paket java.util.zip für die Verarbeitung von .tar.gz-Dateien zu kombinieren . Sie können es entweder direkt herunterladen oder in org.apache.tools.tar finden, das jetzt zu ant.jar gehört.