it-swarm.asia

كيف يمكنني فك ضغط .tar.gz في خطوة واحدة (باستخدام 7-Zip)؟

أستخدم 7-Zip على نظام التشغيل Windows XP وكلما قمت بتنزيل ملف .tar.gz يستغرق الأمر خطوتين لاستخراج الملف (الملفات) بالكامل.

  1. انقر بزر الماوس الأيمن فوق الملف example.tar.gz واختر 7-Zip -> Extract Here من قائمة السياق.
  2. بعد ذلك ، أخذ الملف الناتج example.tar وانقر بزر الماوس الأيمن مرة أخرى واختر 7-Zip -> استخراج هنا من قائمة السياق.

هل هناك طريقة من خلال قائمة السياق للقيام بذلك في خطوة واحدة؟

79
quickcel

ليس صحيحا. إن ملف .tar.gz أو .tgz عبارة عن تنسيقين: .tar هو الأرشيف ، و .gz هو الضغط. لذا فإن الخطوة الأولى تقوم بإلغاء الضغط ، والخطوة الثانية تستخرج الأرشيف.

للقيام بذلك كله في خطوة واحدة ، تحتاج إلى برنامج tar. يشمل Cygwin هذا.

tar xzvf foobaz.tar.gz

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

يمكنك أيضًا القيام بذلك "في خطوة واحدة" عن طريق فتح الملف في واجهة المستخدم الرسومية لـ 7-Zip: افتح الملف .tar.gz ، وانقر نقرًا مزدوجًا فوق الملف .tar المضمن ، ثم قم باستخراج هذه الملفات إلى موقعك الذي تختاره.

هناك خيط تشغيل طويل هنا من الأشخاص الذين يسألون/يصوتون من أجل معالجة خطوة واحدة لملفات tgz و bz2. يشير عدم وجود إجراء حتى الآن إلى أنه لن يحدث حتى يخطو شخص ما ويساهم بشكل مفيد (الرمز ، المال ، شيء ما).

45
quack quixote

سؤال قديم ، لكنني كنت أواجهه اليوم لذا ها هي 2c. يمكن لأداة سطر الأوامر 7Zip "7z.exe" (لدي تثبيت الإصدار 9.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 التي تستدعي الأمر أعلاه باستخدام أداة رجديت أو أداة خارجية مثل stexbar .

21
user2856

بدءًا من 7-Zip 9.04 ، يوجد خيار لسطر الأوامر للقيام بعملية الاستخراج المدمجة دون استخدام التخزين الوسيط لملف .tar العادي:

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

-tgzip مطلوبة إذا تم تسمية ملف الإدخال .tgz بدلاً من .tar.gz.

7
Joachim Sauer

أنت تستخدم نظام التشغيل Windows XP ، لذلك يجب تثبيت Windows Scripting Host افتراضيًا. مع ما يقال ، إليك نص WSH JScript للقيام بما تحتاجه. ما عليك سوى نسخ الرمز إلى اسم ملف xtract.bat أو شيء ما على طول هذه الخطوط (يمكن أن يكون مهما كان طوله ملحق .bat) ، ثم قم بتشغيل :

xtract.bat example.tar.gz

بشكل افتراضي ، سوف يتحقق البرنامج النصي من مجلد البرنامج النصي ، بالإضافة إلى متغير البيئة PATH الخاص بنظامك لـ 7z.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);
4
Charles Grunwald

كما ترون 7 الرمز البريدي ليست جيدة جدا في هذا. لقد كان الناس يسألون عن عملية ذرية للقارورة منذ عام 2009. إليك برنامج صغير (490 كيلوبايت) في Go يمكنه القيام بذلك ، قمت بتجميعه من أجلك.

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)
    }
  }
}
2
Steven Penny

بدءاً من نظام التشغيل Windows 10 build 17063 ، يتم دعم tar و curl ، وبالتالي فمن الممكن فك ضغط ملف .tar.gz في خطوة واحدة باستخدام أمر tar ، كما يلي.

tar -xzvf your_archive.tar.gz

اكتب tar --help لمزيد من المعلومات حول tar.

1
Juniver Hazoic

7za يعمل بشكل صحيح على النحو التالي:

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