한 번에 .tar.gz의 압축을 풀려면 어떻게해야합니까 (7-Zip 사용)?


82

Windows XP에서 7-Zip을 사용하고 있으며 .tar.gz 파일을 다운로드 할 때마다 파일을 완전히 추출하는 데 두 단계가 필요합니다.

  1. example.tar.gz 파일을 마우스 오른쪽 버튼으로 클릭 하고 상황에 맞는 메뉴에서 7-Zip-> Extract Here 를 선택 합니다.
  2. 그런 다음 결과 example.tar 파일 을 가져 와서 마우스 오른쪽 버튼으로 다시 클릭 하고 상황에 맞는 메뉴에서 7-Zip-> Extract Here 를 선택하십시오.

상황에 맞는 메뉴를 통해 한 번에이를 수행 할 수있는 방법이 있습니까?

답변:


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

6
@davr : 7-zip은 오픈 소스 노력입니다. 이 기능을 요청하십시오. v4.65가 작동하는 방식입니다. 최신 v9.x 알파를 시도하지 않았으므로 이미 포함되어있을 수 있습니다.
quack quixote

야, 이것이 WinRar의 작업에서 놓친 것입니다. 나는 오늘, 2012 년 10 월까지 7zip이 여전히 1 단계로 자동 압축 해제되지 않는다는 것을 확인할 수 있습니다. 한숨
fedmich

8
"한 단계에서"명령은 실제로 한 단계에서 수행하지 않고 실제로 .gz를 임시 폴더로 압축 해제 한 다음 .tar 파일을 7-zip으로 엽니 다. 아카이브가 충분히 작 으면 눈에 띄지 않지만 큰 아카이브에서는 매우 눈에.니다. 설명이 필요하다고 생각했습니다.
naasking

1 단계 지침에 대한 새로운 답변이 있습니다.
Barett

25

오래된 질문이지만 오늘 나는 그것을 고투하고 있었으므로 여기에 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)을 참조하십시오.

regedit 또는 stexbar 와 같은 타사 도구를 사용하여 위 명령을 호출하는 .tar.gz / .tgz 파일에 대한 상황에 맞는 메뉴 항목을 만들 수 있습니다 .


-aoa 스위치는 무엇을합니까? -에 표시되지 않습니까? 페이지
Superole

2
..ahh 그러나 도움말 파일에 있습니다. -ao [a | s | t | u] (덮어 쓰기 모드). 따라서 : -aoa = 프롬프트없이 기존 파일을 모두 덮어 쓰기
Superole

좋은 대답이지만 루프는 OP에 의해 요청되지 않았습니다. 요아킴의 (유사한) 한줄짜리 대답은 위대합니다.
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 탐색기 상황에 맞는 메뉴로 가져 오는 방법이 있습니까?
Brian Leishman

4

Windows XP를 사용하고 있으므로 기본적으로 Windows 스크립팅 호스트가 설치되어 있어야합니다. 그렇게 말하면, 필요한 것을 수행하는 WSH JScript 스크립트가 있습니다. 코드를 파일 이름 xtract.bat 또는 해당 행을 따라 복사하십시오 (확장자가있는 한 무엇이든 가능 .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);

내가 아는 것은 아닙니다. 처음에 다음 소스 리포지토리에서 찾았습니다. github.com/ynkdir/winscript WSH jscript 엔진은 주석이 시작될 때까지 첫 번째 비트를 무시하기 때문에 작동합니다. 자세한 내용은 다음 stackoverflow.com/questions/4999395/...
찰스 그룬 왈드을

이것을 찾았습니다 : javascriptkit.com/javatutors/conditionalcompile2.shtml@set @var = value 컴파일 타임 변수를 선언하기위한 JScript 구문 임을 나타냅니다 . 따라서 유효한 JScript와 CMD 명령입니다
hdgarrood

2

보시다시피 7-Zip은 이것에별로 좋지 않습니다. 사람들은 한 요구 2009 년 이후 타르볼 원자 조작 여기에 작은 프로그램입니다 그것을 할 수 있습니다 이동에 (4백90킬로바이트가), 나는 그것을 컴파일 당신을 위해.

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를 구축 윈도우 10에서 시작 tarcurl지원, 그러므로 사용하여 한 단계에서 .tar.gz를 파일을 압축 해제 할 수 있습니다 tar아래와 같이 명령을 사용합니다.

tar -xzvf your_archive.tar.gz

tar --help대한 자세한 내용을 보려면 입력 하십시오 tar.


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.