Bir .tar.gz dosyasını bir adımda nasıl açabilirim (7-Zip kullanarak)?


82

Windows XP'de 7-Zip kullanıyorum ve bir .tar.gz dosyasını indirdiğimde dosyaları tamamen çıkartmam iki adım alıyor.

  1. Example.tar.gz dosyasına sağ tıklayıp içerik menüsünden 7-Zip -> Extract Here'ı seçiyorum .
  2. Daha sonra ortaya çıkan example.tar dosyasını alıyorum ve tekrar sağ tıklayın ve bağlam menüsünden 7-Zip -> Buradan Çıkar'ı seçin.

Bunu bağlam adımında bir adımda yapmanın bir yolu var mı?

Yanıtlar:


46

Pek sayılmaz. Bir .tar.gz veya .tgz dosyası gerçekten iki formattır: .tararşiv ve .gzsıkıştırmadır. Böylece ilk adım açılır ve ikinci adım arşivi çıkarır.

Hepsini bir adımda yapmak için tarprograma ihtiyacınız var . Cygwin bunu içerir.

tar xzvf foobaz.tar.gz

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

Ayrıca, 7-zip GUI'de dosyayı açarak "bir adımda" da yapabilirsiniz: .tar.gzDosyayı açın , dahil edilen .tardosyayı çift ​​tıklayın , sonra bu dosyaları seçtiğiniz yerlere çıkartın.

Burada , tgz ve bz2 dosyalarının bir adım işlenmesini isteyen / oy veren insanların çalıştığı uzun bir iş parçacığı var . Şimdiye kadarki eksiklik eylemi, birisi anlamlı bir şekilde adım atıp katkıda bulunana kadar (kod, para, bir şey) gerçekleşmeyeceğini gösterir.


70
7zip akıllı olsaydı, kullanıcının yapmak istediği zamanın% 99,99'undan beri varsayılan olarak tek adımda yapardı. Aslında, bu WinRar'ın varsayılan işlemidir.
davr

6
@davr: 7-zip açık kaynaklı bir çabadır; Bu özelliği istemek için çekinmeyin. v4.65 böyle işler; daha yeni v9.x alphas'ı denemedim, bu yüzden zaten dahil edilmiş olabilir.
quix quixote

Yah, WinRar'ın operasyonundan özlediğim şey bu. Bugüne kadar Ekim2012, 7zip'in hala 1 adımda otomatik olarak açmadığını doğrulayabilirim. iç
fedmich

8
"Bir adımda" komutların aslında bir adımda yapmadığını, gerçekte .gz'nin geçici bir klasöre sıkıştırıldığını ve ardından .tar dosyasını 7-zip olarak açtığını unutmayın. Arşivler yeterince küçük olduğunda, fark edilmez, ancak büyük arşivlerde çok belirgindir. Sadece açıklama hak ettiğini düşündüm.
13'te

Tek adımlı talimatlarla yeni bir cevap var.
Barett

25

Eski soru, ama bugün onunla mücadele ediyordum bu yüzden işte benim 2c. 7zip komut satırı aracı "7z.exe" (yüklü v9.22 var) stdout'a yazabilir ve stdin'den okuyabilir, böylece bir boru kullanarak ara tar dosyası olmadan yapabilirsiniz:

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

Nerede:

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

Komut satırı komutları ve anahtarları hakkında daha fazla bilgi için kurulum dizinindeki yardım dosyasına (7-zip.chm) bakın.

Regedit veya stexbar gibi bir üçüncü taraf aracı kullanarak yukarıdaki komutu çağıran .tar.gz / .tgz dosyaları için bir bağlam menüsü girişi oluşturabilirsiniz .


-aoa anahtarı ne işe yarıyor? Listelenmemiş -? sayfa
Superole 23:13

2
..ahh ama yardım dosyasında; -ao [a | s | t | u] (üzerine yazma modu). Bu nedenle: -aoa = komut isteminde
bulunmayan

İyi cevap, ancak döngü OP tarafından istenmedi. Joachim'in (benzer) tek satırlık cevabı harika ve konuya!
Jason

@Jason bu cevabın SO
cevabımla

9

7-zip 9.04 ile başlayarak, düz .tardosya için ara depolama kullanmadan birleştirilmiş çıkartma yapmak için bir komut satırı seçeneği vardır :

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

-tgzipgiriş dosyası .tgzyerine adlandırılmışsa gereklidir .tar.gz.


2
Bunu Windows 10 Explorer içerik menüsüne sokmanın bir yolu var mı?
Brian Leishman

4

Windows XP kullanıyorsunuz, bu nedenle varsayılan olarak Windows Komut Dosyası Sistemi yüklü olmalıdır. Olduğu söyleniyor, işte ihtiyacınız olanı yapmak için bir WSH JScript komut dosyası. Kodu yalnızca xtract.bat dosya adına veya bu satırlar boyunca bir şeye kopyalayın (uzantısına sahip olduğu sürece ne olabilir .bat), ve çalıştırın:

xtract.bat example.tar.gz

Varsayılan olarak, komut dosyası, komut dizininin yanı sıra PATH7z.exe için sisteminizin ortam değişkenini de denetler. Maddelerin görünüşünü değiştirmek istiyorsanız, betiğin üstündeki SevenZipExe değişkenini, çalıştırılabilir adın ne olmasını istediğinize göre değiştirebilirsiniz. (Örneğin, 7za.exe veya 7z-real.exe) SevenZipDir'i değiştirerek yürütülebilir dosya için varsayılan bir dizin de ayarlayabilirsiniz. Yani eğer 7z.exealtındadır C:\Windows\system32\7z.exe, sen koyardım:

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

Her neyse, işte senaryo:

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

Farkında olduğumdan değil. Başlangıçta aşağıdaki kaynak havuzunda buldum: github.com/ynkdir/winscript Çalışıyor, çünkü WSH jscript motoru, yorum başlangıcına kadar ilk biti görmezden geliyor. Daha fazla bilgi bulunabilir: stackoverflow.com/questions/4999395/…
Charles Grunwald

bunu buldu: javascriptkit.com/javatutors/conditionalcompile2.shtml@set @var = value , derleme zamanı değişkenlerini bildirmek için JScript sözdizimi olduğunu gösteriyor . Bu yüzden geçerli bir JScript ve bir CMD komutu var
hdgarrood

2

Gördüğünüz gibi 7-Zip bu konuda pek iyi değil. İnsanlar 2009'dan beri tarball atom operasyonu istediler . İşte Go'da yapabilecek küçük bir program (490 KB), bunu sizin için derledim .

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

17063 build, Windows 10 başlayarak tarve curldesteklenir, nedenle kullanarak tek bir adımda bir .tar.gz dosyasını açmanız mümkündür taraşağıda komutu.

tar -xzvf your_archive.tar.gz

Tip tar --helphakkında daha fazla bilgi için tar.


katran, kıvrılma, ssh, sftp, rmb yapıştırma ve daha geniş ekran. Kullanıcılar şımarık çürümüş.
mckenzm

0

7za aşağıdaki gibi düzgün çalışır:

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

3
Bu komutun nasıl çalıştığıyla ilgili bir bağlam ekleyebilir misiniz? Lütfen nasıl cevaplanır ve turumuza katılırım .
Burgi,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.