Bagaimana cara saya unzip a .tar.gz dalam satu langkah (menggunakan 7-Zip)?

82

Saya menggunakan 7-Zip pada Windows XP dan setiap kali saya mengunduh file .tar.gz saya butuh dua langkah untuk mengekstrak sepenuhnya file.

  1. Saya klik kanan pada file example.tar.gz dan pilih 7-Zip -> Extract Here dari menu konteks.
  2. Saya kemudian mengambil file example.tar yang dihasilkan dan klik kanan lagi dan pilih 7-Zip -> Extract Here dari menu konteks.

Apakah ada cara melalui menu konteks untuk melakukan ini dalam satu langkah?

quickcel
sumber

Jawaban:

46

Tidak juga. File .tar.gz atau .tgz sesungguhnya adalah dua format: .tararsip, dan .gzmerupakan kompresi. Jadi langkah pertama terekompresi, dan langkah kedua mengekstrak arsip.

Untuk melakukan semuanya dalam satu langkah, Anda memerlukan tarprogram. Cygwin termasuk ini.

tar xzvf foobaz.tar.gz

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

Anda juga bisa melakukannya "dalam satu langkah" dengan membuka file di GUI 7-zip: Buka .tar.gzfile, klik dua kali .tarfile yang disertakan , kemudian ekstrak file-file itu ke lokasi pilihan Anda.

Ada utas yang sudah lama berjalan di sini dari orang-orang yang meminta / memberikan suara untuk penanganan satu langkah file tgz dan bz2. Kurangnya tindakan sejauh ini menunjukkan itu tidak akan terjadi sampai seseorang melangkah dan berkontribusi secara bermakna (kode, uang, sesuatu).

quack quixote
sumber
70
Jika 7zip pintar, itu akan melakukannya dalam satu langkah secara default, karena 99,99% dari waktu itulah yang ingin dilakukan pengguna. Sebenarnya, ini adalah operasi default WinRar.
davr
6
@davr: 7-zip adalah upaya sumber terbuka; jangan ragu untuk meminta fitur ini. ini adalah bagaimana v4.65 beroperasi; saya belum mencoba alfabet v9.x yang lebih baru, jadi mungkin sudah disertakan.
quack quixote,
Yah, ini yang saya lewatkan dari operasi WinRar. Saya dapat mengonfirmasi bahwa hingga hari ini, Oct2012, 7zip masih belum melakukan dekompresi otomatis dengan 1 langkah. sigh
fedmich
8
Perhatikan bahwa instruksi "dalam satu langkah" tidak benar-benar melakukannya dalam satu langkah, itu sebenarnya mendekompresi .gz ke folder sementara, kemudian membuka file .tar dalam 7-zip. Ketika arsip cukup kecil, itu hampir tidak terlihat, tetapi sangat terlihat pada arsip besar. Hanya berpikir klarifikasi yang layak.
naasking
Ada jawaban baru dengan instruksi satu langkah.
Barett
25

Pertanyaan lama, tapi saya berjuang dengan itu hari ini jadi inilah 2c saya. Alat commandline 7zip "7z.exe" (Saya telah menginstal v9.22) dapat menulis ke stdout dan membaca dari stdin sehingga Anda dapat melakukannya tanpa file tar perantara dengan menggunakan pipa:

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

Dimana:

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

Lihat file bantuan (7-zip.chm) di direktori instal untuk info lebih lanjut tentang perintah dan sakelar baris perintah.

Anda dapat membuat entri menu konteks untuk file .tar.gz / .tgz yang memanggil perintah di atas menggunakan regedit atau alat pihak ke-3 seperti stexbar .

pengguna2856
sumber
apa yang dilakukan saklar -aoa? Itu tidak tercantum dalam -? Halaman
Superole
2
..ahh tetapi ada di file bantuan; -ao [a | s | t | u] (mode timpa). dengan demikian: -aoa = menimpa semua file yang ada tanpa diminta
Superole
Jawaban yang bagus tetapi loop tidak diminta oleh OP. Jawaban satu baris Joachim sangat mirip dan to the point!
Jason
@ Alasan jawaban itu persis sama dengan jawaban SO saya stackoverflow.com/a/14699663/737471 Saya mungkin saja mengedit yang satu ini ...
user2856
9

Dimulai dengan 7-zip 9.04 ada opsi baris perintah untuk melakukan ekstraksi gabungan tanpa menggunakan penyimpanan perantara untuk .tarfile biasa :

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

-tgzipdiperlukan jika file input dinamai .tgzbukan .tar.gz.

Joachim Sauer
sumber
2
Adakah cara untuk memasukkannya ke dalam menu konteks Windows 10 Explorer?
Brian Leishman
4

Anda menggunakan Windows XP, jadi Anda harus menginstal Host Scripting Windows secara default. Dengan itu, inilah script WSH JScript untuk melakukan apa yang Anda butuhkan. Cukup salin kode ke nama file xtract.bat atau sesuatu di sepanjang baris tersebut (bisa apa saja asalkan memiliki ekstensi .bat), dan jalankan:

xtract.bat example.tar.gz

Secara default, skrip akan memeriksa folder skrip, serta PATHvariabel lingkungan sistem Anda untuk 7z.exe. Jika Anda ingin mengubah tampilannya, Anda dapat mengubah variabel SevenZipExe di bagian atas skrip menjadi apa pun yang Anda inginkan dengan nama yang dapat dieksekusi. (Misalnya, 7za.exe atau 7z-real.exe) Anda juga dapat mengatur direktori default untuk dieksekusi dengan mengubah SevenZipDir. Jadi jika 7z.exeada C:\Windows\system32\7z.exe, Anda akan meletakkan:

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

Bagaimanapun, ini skripnya:

@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);
Charles Grunwald
sumber
Bukannya aku sadar. Saya awalnya menemukannya di repositori sumber berikut: github.com/ynkdir/winscript Berhasil , karena mesin jscript WSH tampaknya mengabaikan bit pertama, hingga komentar dimulai. Informasi lebih lanjut dapat ditemukan di: stackoverflow.com/questions/4999395/…
Charles Grunwald
menemukan ini: javascriptkit.com/javatutors/conditionalcompile2.shtml yang tampaknya mengindikasikan itu @set @var = valueadalah sintaks JScript untuk mendeklarasikan variabel waktu kompilasi. Jadi itu adalah perintah JScript dan CMD yang
valid
2

Seperti yang Anda lihat 7-Zip tidak terlalu bagus dalam hal ini. Orang-orang telah meminta operasi atom tarball sejak 2009. Ini adalah program kecil (490 KB) di Go yang dapat melakukannya, saya mengkompilasinya untuk Anda.

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

Mulai dari Windows 10 build 17063, tardan curldidukung, oleh karena itu dimungkinkan untuk unzip file .tar.gz dalam satu langkah dengan menggunakan tarperintah, seperti di bawah ini.

tar -xzvf your_archive.tar.gz

Ketik tar --helpuntuk informasi lebih lanjut tentang tar.

Juniver Hazoic
sumber
tar, curl, ssh, sftp, rmb paste dan layar yang lebih luas. Pengguna busuk busuk.
mckenzm
0

7za berfungsi dengan baik seperti di bawah ini:

7za.exe x D:\pkg-temp\Prod-Rtx-Service.tgz -so | 7za.exe x -si -ttar -oD:\pkg-temp\Prod-Rtx-Service
Alan Hu
sumber
3
Bisakah Anda menambahkan beberapa konteks di sekitar cara kerja perintah ini? Silakan lihat Cara Menjawab dan ikuti tur kami .
Burgi