150

I am using 7-Zip on Windows XP and whenever I download a .tar.gz file it takes me two steps to completely extract the file(s).

  1. I right-click on the example.tar.gz file and choose 7-Zip --> Extract Here from the context menu.
  2. I then take the resulting example.tar file and the right-click again and choose 7-Zip --> Extract Here from the context menu.

Is there a way through the context menu to do this in one step?

1

8 Answers 8

66

Not really. A .tar.gz or .tgz file really is two formats: .tar is the archive, and .gz is the compression. So the first step decompresses, and the second step extracts the archive.

To do it all in one step, you need the tar program. Cygwin includes this.

tar xzvf foobaz.tar.gz

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

You could also do it "in one step" by opening the file in the 7-zip GUI: Open the .tar.gz file, double click the included .tar file, then extract those files to your location of choice.

There's a long running thread here of people asking/voting for one-step handling of tgz and bz2 files. The lack action thus far indicates it's not going to happen until someone steps and contributes meaningfully (code, money, something).

8
  • 127
    If 7zip were smart, it would do it in one step by default, since 99.99% of the time that's what the user wants to do. In fact, this is WinRar's default operation. Commented Dec 7, 2009 at 20:35
  • 7
    @davr: 7-zip is an open source effort; feel free to request this feature. this is how v4.65 operates; i haven't tried the newer v9.x alphas, so it may already be included. Commented Dec 7, 2009 at 20:52
  • 12
    Note that the "in one step" instructions doesn't actually do it in one step, it actually decompresses the .gz into a temporary folder, then opens the .tar file in 7-zip. When the archives are small enough, it's hardly noticeable, but it's very noticeable on large archives. Just thought that deserved clarification. Commented Oct 25, 2013 at 18:29
  • 4
    Is there a solution for users of 7-zip app on Windows OS, using context menu? Commented Oct 10, 2018 at 7:10
  • 2
    Thanks for the answer. BTW it worked for me even without Cygwin. tar happened to be on my Windows 10 from the get go: C:\Windows\system32\tar.exe Commented Dec 22, 2020 at 8:23
64

Old question, but I was struggling with it today so here's my 2c. The 7zip commandline tool "7z.exe" (I have v9.22 installed) can write to stdout and read from stdin so you can do without the intermediate tar file by using a pipe:

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

Where:

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

See the help file (7-zip.chm) in the install directory for more info on the command line commands and switches.

You can create a context menu entry for .tar.gz/.tgz files that calls the above command using regedit or a 3rd party tool like stexbar.

5
  • what does the -aoa switch do? It's not listed in -? page Commented Oct 23, 2013 at 8:40
  • 3
    ..ahh but it is in the help file; -ao[a|s|t|u] (overwrite mode). thus: -aoa = overwrite all existing files w/o prompt Commented Oct 23, 2013 at 8:47
  • Good answer but the loop was not asked for by OP. Joachim's (similar) one-line answer is great and to the point! Commented Jun 7, 2018 at 23:31
  • @Jason that answer is exactly the same as my SO answer stackoverflow.com/a/14699663/737471 I may just edit this one... Commented Jun 7, 2018 at 23:35
  • 1
    To make it more automatic, you could try set filename=%~1 \\ set exe="C:\Program Files\7-Zip\7z.exe" \\ for /F "delims=" %%i in ("%filename%") do set basename="%%~ni" \\ %exe% x %1 -so | %exe% x -aoa -si -ttar -o%basename% store that in a batch/cmd-file and put that in the context-menu via regedit, e.g.: HKEY_CLASSES_ROOT\*\shell\Unzip tar.gz\command Commented Aug 10, 2021 at 10:18
27

Starting with 7-zip 9.04 there is a command-line option to do the combined extraction without using intermediate storage for the plain .tar file:

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

-tgzip is needed if the input file is named .tgz instead of .tar.gz.

2
  • 16
    Any way to get that into the Windows 10 Explorer context menu? Commented Aug 29, 2018 at 19:57
  • I'd rather not have to think of the file extension; just expand it. This also doesn't add much to 7z x filename.tar.gz && 7z x filename.tar && rm filename.tar. Commented May 6, 2025 at 13:36
14

Starting from Windows 10 build 17063, tar and curl are supported, therefore it is possible to unzip a .tar.gz file in one step by using tar command, as below.

tar -xzvf your_archive.tar.gz

Type tar --help for more information about tar.

1
  • tar, curl, ssh, sftp, rmb pasting and wider screen. Users are spoiled rotten. Commented Apr 23, 2019 at 3:54
5

You're using Windows XP, so you should have Windows Scripting Host installed by default. With that being said, here's a WSH JScript script to do what you need. Just copy the code to a file name xtract.bat or something along those lines (Can be whatever as long as it has the extension .bat), and run:

xtract.bat example.tar.gz

By default, the script will check the folder of the script, as well as your system's PATH environment variable for 7z.exe. If you want to change how it looks for stuff, you can change the SevenZipExe variable at the top of the script to whatever you want the executable name to be. (For instance, 7za.exe or 7z-real.exe) You can also set a default directory for the executable by changing SevenZipDir. So if 7z.exe is at C:\Windows\system32\7z.exe, you'd put:

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

Anyways, here's the script:

@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
4

As you can see 7-Zip is not very good at this. People have been asking for tarball atomic operation since 2009. As an alternative, you can use the Arc program. Example command:

arc unarchive test.tar.gz
1
  • Beware: this is "archiver" ... not the arc (Archive Utility) tool provided by APT. Note also that "archiver" has been archived (on Github) since November 2024. Commented May 6, 2025 at 13:24
1

I am using 7zip v19.00, just right click and choose extract here will do the work. Although 7zip issues warning, the result is fine for me.

2
  • 1
    I got a .tar file the first time, and had to run it again, then success. Commented Nov 27, 2022 at 23:38
  • I'm using 7-Zip 23.01. This answer doesn't work in one step for .tar.gz files. Commented Jan 20, 2025 at 21:14
0

7za is work properly as below:

7za.exe x D:\pkg-temp\Prod-Rtx-Service.tgz -so | 7za.exe x -si -ttar -oD:\pkg-temp\Prod-Rtx-Service
1
  • 4
    Can you add some context around how this command works? Please see How to Answer and take our tour. Commented Aug 31, 2018 at 9:08

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.