ฉันจะแตกไฟล์. tar.gz ในขั้นตอนเดียวได้อย่างไร (ใช้ 7-Zip)


81

ฉันใช้ 7-Zip บน Windows XP และเมื่อใดก็ตามที่ฉันดาวน์โหลดไฟล์. tar.gz ต้องใช้สองขั้นตอนในการแตกไฟล์อย่างสมบูรณ์

  1. ฉันคลิกขวาที่ไฟล์example.tar.gzและเลือก7-Zip -> แตกที่นี่จากเมนูบริบท
  2. จากนั้นฉันจะใช้ไฟล์example.tarและคลิกขวาอีกครั้งแล้วเลือก7-Zip -> แตกที่นี่จากเมนูบริบท

มีวิธีผ่านเมนูบริบทในการทำเช่นนี้ในขั้นตอนเดียว?

คำตอบ:


46

ไม่ได้จริงๆ ไฟล์. 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 GUI: เปิด.tar.gzไฟล์ดับเบิลคลิกที่.tarไฟล์ที่รวมแล้วแยกไฟล์เหล่านั้นไปยังตำแหน่งที่คุณเลือก

มีด้ายยาวเป็นที่นี่ของคนถาม / การออกเสียงลงคะแนนในการจัดการขั้นตอนหนึ่งของไฟล์ tgz และ bz2 การดำเนินการที่ไม่เพียงพอบ่งชี้ว่าจะไม่เกิดขึ้นจนกว่าจะมีคนก้าวเข้ามาและมีส่วนช่วยอย่างมีความหมาย (รหัสเงินบางอย่าง)


70
หาก 7zip เป็นสมาร์ทมันจะทำในขั้นตอนเดียวโดยค่าเริ่มต้นตั้งแต่ 99.99% ของเวลาที่เป็นสิ่งที่ผู้ใช้ต้องการที่จะทำ อันที่จริงนี่คือการดำเนินการเริ่มต้นของ WinRar
davr

5
@davr: 7-zip เป็นความพยายามแบบโอเพนซอร์ส อย่าลังเลที่จะขอคุณสมบัตินี้ นี่คือวิธีที่ v4.65 ทำงาน ฉันยังไม่ได้ลองเวอร์ชัน v9.x ใหม่กว่านี้ดังนั้นจึงอาจรวมอยู่ด้วย
ต้มตุ๋น Quixote

นี่คือสิ่งที่ฉันพลาดจากการทำงานของ WinRar ฉันสามารถยืนยันได้จนถึงวันนี้ Oct2012, 7zip ยังไม่ขยายอัตโนมัติด้วยขั้นตอนที่ 1 ถอนหายใจ
fedmich

7
โปรดทราบว่าคำแนะนำ "ในขั้นตอนเดียว" ไม่ได้ทำในขั้นตอนเดียวจริง ๆ แล้วแตกไฟล์. gz ลงในโฟลเดอร์ชั่วคราวจากนั้นเปิดไฟล์. tar ใน 7-zip เมื่อคลังเก็บมีขนาดเล็กพอจะสังเกตได้ยาก แต่ก็สังเกตได้ชัดเจนบนคลังเก็บขนาดใหญ่ แค่คิดว่าสมควรชี้แจง
naasking

มีคำตอบใหม่พร้อมคำแนะนำแบบขั้นตอนเดียว
Barett

25

คำถามเก่า แต่ฉันต้องดิ้นรนกับมันในวันนี้ดังนั้นนี่คือ 2c ของฉัน เครื่องมือ commandline 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 เช่นstexbar


สวิตช์ -aoa ทำหน้าที่อะไร มันไม่ได้อยู่ใน -? หน้า
Superole

2
..ahh แต่มันอยู่ในไฟล์ช่วยเหลือ; -ao [a | s | t | u] (โหมดเขียนทับ) ดังนั้น: -aoa = เขียนทับไฟล์ที่มีอยู่ทั้งหมดโดยไม่มีพรอมต์
Superole

คำตอบที่ดี แต่ OP ไม่ได้ถูกถามจาก OP คำตอบแบบบรรทัดเดียวของโจอาคิมนั้นยอดเยี่ยมมากและตรงประเด็น!
Jason

@ Jason คำตอบนั้นเหมือนกันกับคำตอบ SO ของฉันstackoverflow.com/a/14699663/737471ฉันสามารถแก้ไขอันนี้ได้ ...
user2856

9

เริ่มต้นด้วย 7-zip 9.04 มีตัวเลือกบรรทัดคำสั่งเพื่อทำการแยกแบบรวมโดยไม่ต้องใช้ที่เก็บข้อมูลระดับกลางสำหรับ.tarไฟล์ธรรมดา:

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

-tgzipเป็นสิ่งจำเป็นหากแฟ้มใส่เป็นชื่อแทน.tgz.tar.gz


2
มีวิธีใดบ้างที่จะเข้าไปในเมนูบริบทของ Windows 10 Explorer
Brian Leishman

4

คุณกำลังใช้ 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);

ไม่ใช่ว่าฉันรู้ เริ่มแรกฉันพบมันในแหล่งเก็บข้อมูลต่อไปนี้: github.com/ynkdir/winscriptมันใช้งานได้เพราะเอ็นจิ้น jscript WSH ไม่สนใจบิตแรกจนกระทั่งเห็นความคิดเห็นเริ่มขึ้น ข้อมูลเพิ่มเติมสามารถดูได้ที่: stackoverflow.com/questions/4999395/…
Charles Grunwald

พบสิ่งนี้: javascriptkit.com/javatutors/conditionalcompile2.shtmlซึ่งดูเหมือนจะระบุว่า@set @var = valueเป็นไวยากรณ์ JScript สำหรับการประกาศตัวแปรเวลาคอมไพล์ ดังนั้นทั้ง JScript และคำสั่ง CMD ที่ใช้ได้
hdgarrood

2

อย่างที่คุณเห็น 7-Zip นั้นไม่ค่อยดีเท่าไหร่ ผู้คนได้รับการร้องขอให้ ดำเนินการอะตอมมิกบอล tarball มาตั้งแต่ปี 2009 นี่คือโปรแกรมขนาดเล็ก (490 KB) ใน 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)
    }
  }
}

1

เริ่มต้นจาก Windows 10 build 17063 tarและcurlได้รับการสนับสนุนดังนั้นจึงเป็นไปได้ที่จะแตกไฟล์. tar.gz ในขั้นตอนเดียวโดยใช้tarคำสั่งดังต่อไปนี้

tar -xzvf your_archive.tar.gz

พิมพ์สำหรับข้อมูลเพิ่มเติมเกี่ยวกับtar --helptar


tar, curl, ssh, sftp, การวาง RMB และหน้าจอที่กว้างขึ้น ผู้ใช้งานจะเน่าเสีย
mckenzm

0

7za ทำงานอย่างถูกต้องดังต่อไปนี้:

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

3
คุณสามารถเพิ่มบริบทเพื่อดูว่าคำสั่งนี้ทำงานอย่างไร โปรดดูวิธีการตอบและใช้เวลาของเราเกี่ยวกับการท่องเที่ยว
Burgi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.