Come decomprimere il file * .TGZ senza modificare il file originale? [duplicare]


1

Possibile duplicato:
come si effettua la compressione di un file e si conserva il file .gz?

Decomprimo il file usando il seguente comando:

gunzip -f  test.TGZ

Questo mi ha dato il file test.tar ma ho perso il file test.TGZ. Esiste un modo per conservare il file originale?

EDIT & Update: sto chiamando i comandi decompress tramite un programma Java. Il file TGZ contiene almeno 1 file di immagine, 1 file di testo e 1 file video.

Metodo Java: esegui il comando

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);
    }
}

Soluzione: attualmente, copio il file TGZ in posizione temporanea e lavoro con quel file.


Sembra un post per SuperUser
monksy il

5
Al contrario (non appartiene a SU): una parte rilevante della gestione dei programmi open source è sapere come gestire i file tar compressi - una parte della programmazione.
Jonathan Leffler,

Se portiamo via la parte di programmazione, questo è un duplicato qui: superuser.com/questions/45650/…
Gnoupi

Risposte:


12

Uso:

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

L'opzione '-c' significa scrivere nell'output standard (anziché modificare il file di input); l'opzione '-d' significa 'decomprimere'.

Puoi anche usare:

gunzip -c test.tgz > test.tar

Se hai una versione abbastanza moderna di GNU 'tar', puoi semplicemente usare:

tar -xf test.tgz

Se hai una versione leggermente più vecchia, devi specificare il programma di compressione:

tar -xzf test.tgz

Su quelle versioni, puoi usare anche 'bzip2':

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

(Nelle versioni più moderne, l'opzione '-j' può essere utilizzata per creare un file tar compresso con bzip2; il codice di unraprap determina automaticamente il decompressore corretto.)


Grazie mille, proverò questi comandi attraverso il mio programma.
nayakam,

per il comando "gunzip -c test.tgz> test.tar": il programma si blocca quando tenta di eseguire il comando
nayakam

1
@Thillakan: Questo perché non puoi chiamare "exec" con un reindirizzamento (il simbolo>). Puoi catturare l'output della chiamata gunzip (usando popeno installando tu stesso le pipe) o usare invece uno dei comandi tar. Se non ti interessa quando / se il programma esiste, puoi usare il sistema ("gunzip -c test.tgz> test.tar") poiché la funzione di sistema accetta il simbolo di reindirizzamento.
Isak Savo,

@Isak, grazie per chiarire il problema. Rimarrò fedele al mio approccio attuale. È facile per me :).
nayakam,

3

Se stai provando a decomprimere un file GZipped tramite Java, potresti prendere in considerazione l'utilizzo della classe java.util.zip.ZipFile . Se si passa a questa classe un riferimento File a un file zip, è possibile scorrere le voci e accedervi come InputStreams, in questo modo:

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

Questa classe gestisce il formato PK-Zip, non il formato gzip.
Kevin Panko,

1

Sono d'accordo con Jonathan Leffler, questo è un programmatore Java che chiede come accedere a un archivio compresso dal suo programma Java. Il fatto che sia un programmatore alle prime armi, cercando di farlo nel modo sbagliato (attraverso il sistema operativo), non cambia il fatto che questa è una domanda di programmazione che appartiene a StackOverflow.

Per rispondere alla domanda originale, doctorruss ha ragione nel suggerire l'uso di una classe. Per accedere a un file .tar, .tar.gz o .tgz, è necessario utilizzare una libreria in grado di accedere agli archivi tar. Il pacchetto com.ice.tar implementa un pacchetto io di tar archive ed è possibile combinare questo pacchetto con il pacchetto java.util.zip per gestire i file .tar.gz . Puoi scaricare direttamente o trovarlo in org.apache.tools.tar che ora fa parte di ant.jar.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.