Como descompactar o arquivo * .TGZ sem alterar o arquivo original? [duplicado]

1

Eu descomprimo o arquivo usando o seguinte comando:

gunzip -f  test.TGZ

Isso me deu o arquivo test.tar, mas perdi o arquivo test.TGZ. Existe alguma maneira de manter o arquivo original?

EDITAR & Atualização:      Eu estou chamando os comandos de descompactação por meio de um programa Java. O arquivo TGZ contém pelo menos 1 arquivo de imagem, 1 arquivo de texto e 1 arquivo de vídeo.

Método Java: execute o 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);
    }
}

Solução: atualmente, copio o arquivo TGZ para um local temporário e trabalho com esse arquivo.

    
por nayakam 14.12.2009 / 06:20

3 respostas

12

Uso:

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

A opção '-c' significa gravar na saída padrão (em vez de modificar o arquivo de entrada); a opção '-d' significa 'descompactar'.

Você também pode usar:

gunzip -c test.tgz > test.tar

Se você tem uma versão moderna do GNU 'tar', você pode simplesmente usar:

tar -xf test.tgz

Se você tem uma versão um pouco mais antiga, é necessário especificar o programa de compactação:

tar -xzf test.tgz

Nessas versões, você também pode usar o 'bzip2':

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

(Em versões mais modernas, a opção '-j' pode ser usada para criar um arquivo tar compactado com bzip2; o código descompactado determina o descompactador correto automaticamente.)

    
por 14.12.2009 / 06:23
3

Se você estiver tentando descompactar um arquivo GZipped por meio do Java, considere a possibilidade de usar o java.util.zip.ZipFile classe. Se você passar esta classe de uma referência de arquivo para um arquivo zip, você pode iterar através de suas entradas e acessá-los como InputStreams, da seguinte forma:

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
    
por 14.12.2009 / 10:50
1

Eu concordo com Jonathan Leffler, este é um programador java perguntando como acessar um arquivo compactado do seu programa java. O fato de ser um programador iniciante, tentando fazer do jeito errado (através do SO), não muda o fato de que esta é uma questão de programação que pertence ao StackOverflow.

Para responder a pergunta original, o doctorruss está correto em sugerir o uso de uma classe. Para acessar um arquivo .tar, .tar.gz ou .tgz, você deve usar uma biblioteca capaz de acessar os arquivos tar. O pacote com.ice.tar implementa um pacote io do arquivo tar e é possível combinar este pacote com o pacote java.util.zip para manipular arquivos .tar.gz . Você pode fazer o download diretamente ou encontrá-lo no org.apache.tools.tar que agora faz parte do ant.jar.

    
por 17.01.2010 / 12:13