2009-12-07 20:01:59 +0000 2009-12-07 20:01:59 +0000
89
89
Advertisement

Wie kann ich ein .tar.gz in einem Schritt entpacken (mit 7-Zip)?

Advertisement

Ich verwende 7-Zip unter Windows XP und immer wenn ich eine .tar.gz-Datei herunterlade, benötige ich zwei Schritte, um die Datei(en) vollständig zu entpacken.

  1. Ich klicke mit der rechten Maustaste auf die Datei example.tar.gz und wähle 7-Zip –> Hier extrahieren aus dem Kontextmenü.
  2. Dann nehme ich die resultierende Datei example.tar und klicke erneut mit der rechten Maustaste und wähle 7-Zip –> Hier entpacken aus dem Kontextmenü.

Gibt es eine Möglichkeit über das Kontextmenü, dies in einem Schritt zu tun?

Advertisement
Advertisement

Antworten (7)

49
49
49
2009-12-07 20:07:52 +0000

Nicht wirklich. Eine .tar.gz- oder .tgz-Datei besteht eigentlich aus zwei Formaten: .tar ist das Archiv, und .gz ist die Komprimierung. Also wird im ersten Schritt dekomprimiert und im zweiten Schritt das Archiv extrahiert.

Um das alles in einem Schritt zu machen, brauchen Sie das Programm tar. Cygwin beinhaltet dieses.

tar xzvf foobaz.tar.gz

; x = eXtract 
; z = filter through gZip
; v = be Verbose (show activity)
; f = filename

Sie könnten es auch “in einem Schritt” machen, indem Sie die Datei in der 7-zip GUI öffnen: Öffnen Sie die .tar.gz-Datei, doppelklicken Sie auf die enthaltene .tar-Datei und extrahieren Sie dann diese Dateien an einen Ort Ihrer Wahl.

Es gibt einen lang laufenden Thread hier von Leuten, die nach einer einstufigen Handhabung von tgz- und bz2-Dateien fragen/abstimmen. Die fehlende Aktion bis jetzt deutet darauf hin, dass es nicht passieren wird, bis jemand einen sinnvollen Beitrag leistet (Code, Geld, irgendwas).

26
26
26
2013-02-05 02:07:01 +0000

Alte Frage, aber ich habe heute damit gekämpft, also hier sind meine 2c. Das 7zip-Kommandozeilenprogramm “7z.exe” (ich habe v9.22 installiert) kann nach stdout schreiben und von stdin lesen, so dass Sie auf die tar-Zwischendatei verzichten können, indem Sie eine Pipe verwenden:

7z x "somename.tar.gz" -so | 7z x -aoa -si -ttar -o"somename"

Wo:

x = Extract with full paths command
-so = write to stdout switch
-si = read from stdin switch
-aoa = Overwrite all existing files without prompt.
-ttar = Treat the stdin byte stream as a TAR file
-o = output directory

Siehe die Hilfedatei (7-zip.chm) im Installationsverzeichnis für weitere Informationen zu den Kommandozeilenbefehlen und Schaltern.

Sie können einen Kontextmenüeintrag für .tar.gz/.tgz-Dateien erstellen, der den obigen Befehl mit regedit oder einem Drittanbieter-Tool wie stexbar aufruft.

10
Advertisement
10
10
2018-01-07 20:23:00 +0000
Advertisement

Ab 7-zip 9.04 gibt es eine Kommandozeilenoption, um die kombinierte Extraktion ohne Zwischenspeicherung für die einfache .tar-Datei durchzuführen:

7z x -tgzip -so theinputfile.tgz | 7z x -si -ttar

-tgzip wird benötigt, wenn die Eingabedatei .tgz statt .tar.gz heißt.

4
4
4
2011-11-26 05:34:01 +0000

Sie verwenden Windows XP, daher sollte der Windows Scripting Host standardmäßig installiert sein. In diesem Sinne finden Sie hier ein WSH-JScript-Skript, das das tut, was Sie brauchen. Kopieren Sie den Code einfach in eine Datei mit dem Namen xtract.bat oder so ähnlich (kann alles sein, solange es die Erweiterung .bat hat), und führen Sie es aus:

xtract.bat example.tar.gz

Standardmäßig überprüft das Skript den Ordner des Skripts sowie die Umgebungsvariable PATH Ihres Systems auf 7z.exe. Wenn Sie die Suche ändern möchten, können Sie die Variable SevenZipExe am Anfang des Skripts so ändern, wie Sie den Namen der ausführbaren Datei haben möchten. (Zum Beispiel 7za.exe oder 7z-real.exe) Sie können auch ein Standardverzeichnis für die ausführbare Datei festlegen, indem Sie SevenZipDir ändern. Wenn also 7z.exe auf C:\Windows\system32z.exe steht, würden Sie folgendes eingeben:

var SevenZipDir = "C:\Windows\system32";

Wie auch immer, hier ist das Skript:

@set @junk=1 /* vim:set ft=javascript:
@echo off
cscript //nologo //e:jscript "%~dpn0.bat" %*
goto :eof
*/
/* Settings */
var SevenZipDir = undefined;
var SevenZipExe = "7z.exe";
var ArchiveExts = ["zip", "tar", "gz", "bzip", "bz", "tgz", "z", "7z", "bz2", "rar"]

/* Multi-use instances */
var WSH = new ActiveXObject("WScript.Shell");
var FSO = new ActiveXObject("Scripting.FileSystemObject");
var __file__ = WScript.ScriptFullName;
var __dir__ = FSO.GetParentFolderName( __file__ );
var PWD = WSH.CurrentDirectory;

/* Prototypes */
(function(obj) {
    obj.has = function object_has(key) {
        return defined(this[key]);
    };
    return obj;
})(this.Object.prototype);

(function(str) {
    str.trim = function str_trim() {
        return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
    };
})(this.String.prototype);

(function(arr) {
    arr.contains = function arr_contains(needle) {
        for (var i in this) {
            if (this[i] == needle) {
                return true;
            }
        }
        return false;
    }
})(this.Array.prototype);

/* Utility functions */
function defined(obj)
{
    return typeof(obj) != "undefined";
}

function emptyStr(obj)
{
    return !(defined(obj) && String(obj).length);
}

/* WSH-specific Utility Functions */
function echo()
{
    if(!arguments.length) return;
    var msg = "";
    for (var n = 0; n < arguments.length; n++) {
        msg += arguments[n];
        msg += " ";
    }
    if(!emptyStr(msg))
        WScript.Echo(msg);
}

function fatal(msg)
{
    echo("Fatal Error:", msg);
    WScript.Quit(1);
}

function findExecutable()
{
    // This function searches the directories in;
    // the PATH array for the specified file name;
    var dirTest = emptyStr(SevenZipDir) ? __dir__ : SevenZipDir;
    var exec = SevenZipExe;
    var strTestPath = FSO.BuildPath(dirTest, exec);
    if (FSO.FileExists(strTestPath))
        return FSO.GetAbsolutePathName(strTestPath);

    var arrPath = String(
            dirTest + ";" + 
            WSH.ExpandEnvironmentStrings("%PATH%")
        ).split(";");

    for(var i in arrPath) {
        // Skip empty directory values, caused by the PATH;
        // variable being terminated with a semicolon;
        if (arrPath[i] == "")
            continue;

        // Build a fully qualified path of the file to test for;
        strTestPath = FSO.BuildPath(arrPath[i], exec);

        // Check if (that file exists;
        if (FSO.FileExists(strTestPath))
            return FSO.GetAbsolutePathName(strTestPath);
    }
    return "";
}

function readall(oExec)
{
    if (!oExec.StdOut.AtEndOfStream)
      return oExec.StdOut.ReadAll();

    if (!oExec.StdErr.AtEndOfStream)
      return oExec.StdErr.ReadAll();

    return -1;
}

function xtract(exec, archive)
{
    var splitExt = /^(.+)\.(\w+)$/;
    var strTmp = FSO.GetFileName(archive);
    WSH.CurrentDirectory = FSO.GetParentFolderName(archive);
    while(true) {
        var pathParts = splitExt.exec(strTmp);
        if(!pathParts) {
            echo("No extension detected for", strTmp + ".", "Skipping..");
            break;
        }

        var ext = pathParts[2].toLowerCase();
        if(!ArchiveExts.contains(ext)) {
            echo("Extension", ext, "not recognized. Skipping.");
            break;
        }

        echo("Extracting", strTmp + "..");
        var oExec = WSH.Exec('"' + exec + '" x -bd "' + strTmp + '"');
        var allInput = "";
        var tryCount = 0;

        while (true)
        {
            var input = readall(oExec);
            if (-1 == input) {
                if (tryCount++ > 10 && oExec.Status == 1)
                    break;
                WScript.Sleep(100);
             } else {
                  allInput += input;
                  tryCount = 0;
            }
        }

        if(oExec. ExitCode!= 0) {
            echo("Non-zero return code detected.");
            break;
        }

        WScript.Echo(allInput);

        strTmp = pathParts[1];
        if(!FSO.FileExists(strTmp))
            break;
    }
    WSH.CurrentDirectory = PWD;
}

function printUsage()
{
    echo("Usage:\r\n", __file__ , "archive1 [archive2] ...");
    WScript.Quit(0);
}

function main(args)
{
    var exe = findExecutable();
    if(emptyStr(exe))
        fatal("Could not find 7zip executable.");

    if(!args.length || args(0) == "-h" || args(0) == "--help" || args(0) == "/?")
        printUsage();

    for (var i = 0; i < args.length; i++) {
        var archive = FSO.GetAbsolutePathName(args(i));
        if(!FSO.FileExists(archive)) {
            echo("File", archive, "does not exist. Skipping..");
            continue;
        }
        xtract(exe, archive);
    }
    echo("\r\nDone.");
}

main(WScript.Arguments.Unnamed);
2
Advertisement
2
2
2016-10-29 18:37:40 +0000
Advertisement

Wie Sie sehen können, ist 7-Zip nicht sehr gut in diesem Bereich. Die Leute haben seit 2009 nach tarball atomic operation gefragt. Hier ist ein kleines Programm (490 KB) in Go, das das kann, ich habe es für Sie kompiliert.

package main
import (
  "archive/tar"
  "compress/gzip"
  "flag"
  "fmt"
  "io"
  "os"
  "strings"
 )

func main() {
  flag.Parse() // get the arguments from command line
  sourcefile := flag.Arg(0)
  if sourcefile == "" {
    fmt.Println("Usage : go-untar sourcefile.tar.gz")
    os.Exit(1)
  }
  file, err := os.Open(sourcefile)
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  defer file.Close()
  var fileReader io.ReadCloser = file
  // just in case we are reading a tar.gz file,
  // add a filter to handle gzipped file
  if strings.HasSuffix(sourcefile, ".gz") {
    if fileReader, err = gzip.NewReader(file); err != nil {
      fmt.Println(err)
      os.Exit(1)
    }
    defer fileReader.Close()
  }
  tarBallReader := tar.NewReader(fileReader)
  // Extracting tarred files
  for {
    header, err := tarBallReader.Next()
    if err != nil {
      if err == io.EOF {
        break
      }
      fmt.Println(err)
      os.Exit(1)
    }
    // get the individual filename and extract to the current directory
    filename := header.Name
    switch header.Typeflag {
    case tar.TypeDir:
      // handle directory
      fmt.Println("Creating directory :", filename)
      // or use 0755 if you prefer
      err = os.MkdirAll(filename, os.FileMode(header.Mode))
      if err != nil {
        fmt.Println(err)
        os.Exit(1)
      }
    case tar.TypeReg:
      // handle normal file
      fmt.Println("Untarring :", filename)
      writer, err := os.Create(filename)
      if err != nil {
        fmt.Println(err)
        os.Exit(1)
      }
      io.Copy(writer, tarBallReader)
      err = os.Chmod(filename, os.FileMode(header.Mode))
      if err != nil {
        fmt.Println(err)
        os.Exit(1)
      }
      writer.Close()
    default:
      fmt.Printf("Unable to untar type : %c in file %s", header.Typeflag,
      filename)
    }
  }
}
1
1
1
2019-04-23 02:33:30 +0000

Ab Windows 10 Build 17063 werden tar und curl unterstützt, daher ist es möglich, eine .tar.gz-Datei in einem Schritt mit dem Befehl tar zu entpacken, wie unten dargestellt.

tar -xzvf your_archive.tar.gz

Tippen Sie tar --help für weitere Informationen zu tar.

0
Advertisement
0
0
2018-08-31 08:08:02 +0000
Advertisement

7za funktioniert ordnungsgemäß wie unten dargestellt:

7za.exe x D:\pkg-temp\Prod-Rtx-Service.tgz -so | 7za.exe x -si -ttar -oD:\pkg-temp\Prod-Rtx-Service
Advertisement

Verwandte Fragen

3
12
8
9
3
Advertisement
Advertisement