如何一步解压缩 .tar.gz(使用 7-Zip)?

如何一步解压缩 .tar.gz(使用 7-Zip)?

我在 Windows XP 上使用 7-Zip,每当我下载 .tar.gz 文件时,我都需要两个步骤才能完全提取该文件。

  1. 我右键单击该example.tar.gz文件并选择7-Zip --> 点击此处解压从上下文菜单中。
  2. 然后我example.tar再次右键单击生成的文件并选择7-Zip --> 点击此处解压从上下文菜单中。

有没有办法通过上下文菜单一步完成此操作?

答案1

不是。.tar.gz 或 .tgz 文件实际上有两种格式:一种.tar是存档,一种.gz是压缩。因此,第一步是解压缩,第二步是提取存档。

要一步完成所有操作,您需要该tar程序。 赛格威包括这个。

tar xzvf foobaz.tar.gz

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

您也可以通过在 7-zip GUI 中打开文件来“一步”完成此操作:打开文件.tar.gz,双击包含的.tar文件,然后将这些文件提取到您选择的位置。

有一个长期讨论的主题这里要求/投票支持一步处理 tgz 和 bz2 文件的人。到目前为止,缺乏行动表明,除非有人采取行动并做出有意义的贡献(代码、金钱等),否则这不会发生。

答案2

这是一个老问题,但是我今天一直在苦苦思索,所以这是我的 2c。7zip 命令行工具“7z.exe”(我安装了 v9.22)可以写入 stdout 并从 stdin 读取,因此您可以使用管道来省去中间 tar 文件:

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

在哪里:

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

有关命令行命令和开关的更多信息,请参阅安装目录中的帮助文件(7-zip.chm)。

您可以为 .tar.gz/.tgz 文件创建一个上下文菜单项,使用 regedit 或第三方工具调用上述命令,例如斯特巴尔

答案3

从 7-zip 9.04 开始,有一个命令行选项可以执行组合提取,而无需使用纯.tar文本文件的中间存储:

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

-tgzip.tgz如果输入文件以 而不是命名,则需要.tar.gz

答案4

您使用的是 Windows XP,因此默认情况下应该已安装 Windows Scripting Host。话虽如此,这里有一个 WSH JScript 脚本可以满足您的需要。只需将代码复制到文件名提取程序或者类似这样的内容(可以是任何内容,只要它有扩展名.bat),然后运行:

xtract.bat example.tar.gz

默认情况下,脚本将检查脚本的文件夹以及PATH7z.exe 的系统环境变量。如果您想更改其查找内容的方式,可以将脚本顶部的 SevenZipExe 变量更改为您想要的可执行文件名称。(例如,7za.exe 或 7z-real.exe)您还可以通过更改 SevenZipDir 为可执行文件设置默认目录。因此,如果7z.exe位于C:\Windows\system32\7z.exe,您可以输入:

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

无论如何,这是脚本:

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

相关内容