Question Comment puis-je décompresser un fichier .tar.gz en une seule étape (en utilisant 7-Zip)?


J'utilise 7-Zip sous Windows XP et chaque fois que je télécharge un fichier .tar.gz, il me faut deux étapes pour extraire complètement le ou les fichiers.

  1. Je fais un clic droit sur le example.tar.gz déposer et choisir 7-Zip -> Extrait ici dans le menu contextuel.
  2. Je prends alors le résultat example.tar fichier et le clic droit à nouveau et choisissez 7-Zip -> Extrait ici dans le menu contextuel.

Existe-t-il un moyen dans le menu contextuel de le faire en une seule étape?


74
2017-12-07 20:01


origine




Réponses:


Pas vraiment. Un fichier .tar.gz ou .tgz est vraiment deux formats: .tar est l'archive, et .gz est la compression. Ainsi, la première étape décompresse et la deuxième étape extrait l'archive.

Pour tout faire en une seule étape, vous avez besoin du tar programme. Cygwin inclut ceci.

tar xzvf foobaz.tar.gz

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

Vous pouvez également le faire "en une étape" en ouvrant le fichier dans l’interface graphique 7-zip: Ouvrez le fichier .tar.gz fichier, double-cliquez sur le fichier inclus .tar fichier, puis extrayez ces fichiers dans l’emplacement de votre choix.

Il y a un long fil de discussion ici de personnes demandant / votant pour le traitement en une étape des fichiers tgz et bz2. Le manque d’action jusqu’à présent indique qu’il ne se produira pas tant que l’on n’aura pas agi et contribuera de manière significative (code, argent, quelque chose).


42
2017-12-07 20:07



Si 7zip était intelligent, il le ferait en une étape par défaut, puisque 99,99% du temps correspond à ce que l'utilisateur souhaite faire. En fait, c'est l'opération par défaut de WinRar. - davr
@davr: 7-zip est un effort open source; n'hésitez pas à demander cette fonctionnalité. c'est ainsi que fonctionne la v4.65; Je n'ai pas essayé les nouveaux alphas v9.x, donc il peut déjà être inclus. - quack quixote
Yah, c'est ce qui me manque dans le fonctionnement de WinRar. Je peux confirmer qu’aujourd’hui, en octobre 2012, 7zip ne décompresse toujours pas avec 1 pas. soupir - fedmich
Notez que les instructions "en une étape" ne le font pas en une seule étape, il décompresse en fait le fichier .gz dans un dossier temporaire, puis ouvre le fichier .tar en 7-zip. Lorsque les archives sont assez petites, elles sont à peine perceptibles, mais elles sont très visibles sur les grandes archives. Juste pensé que méritait une clarification. - naasking
Il y a une nouvelle réponse avec les instructions en une étape. - Barett


Ancienne question, mais je me débattais avec ça aujourd'hui alors voici mon 2c. L'outil en ligne de commande 7zip "7z.exe" (sur lequel la version 9.22 est installée) peut écrire sur stdout et lire depuis stdin. Vous pouvez donc vous passer du fichier tar intermédiaire en utilisant un tube:

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

Où:

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

Consultez le fichier d'aide (7-zip.chm) dans le répertoire d'installation pour plus d'informations sur les commandes et les commutateurs de la ligne de commande.

Vous pouvez créer une entrée de menu contextuel pour les fichiers .tar.gz / .tgz qui appelle la commande ci-dessus en utilisant regedit ou un outil tiers tel que Stexbar.


18
2018-02-05 02:07



qu'est-ce que le commutateur -aoa fait? Il n'est pas listé dans -? page - Superole
..ahh mais c'est dans le fichier d'aide; -ao [a | s | t | u] (mode écrasement). Ainsi: -aoa = écraser tous les fichiers existants sans invite - Superole
Bonne réponse mais la boucle n'a pas été demandée par OP. La réponse à une ligne de Joachim (similaire) est excellente et pertinente! - Jason
@Jason cette réponse est exactement la même que ma réponse SO stackoverflow.com/a/14699663/737471 Je peux juste éditer celui-ci ... - Luke


À partir de 7-zip 9.04, il existe une option de ligne de commande pour effectuer l'extraction combinée sans utiliser de stockage intermédiaire pour la plaine .tar fichier:

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

-tgzip est nécessaire si le fichier d'entrée est nommé .tgz au lieu de .tar.gz.


5
2018-01-07 20:23





Vous utilisez Windows XP, vous devez donc avoir Windows Scripting Host installé par défaut. Cela étant dit, voici un script WSH JHS pour faire ce dont vous avez besoin. Il suffit de copier le code dans un nom de fichier xtract.bat ou quelque chose dans ce sens (Peut être n'importe quoi pourvu qu'il ait l'extension .bat), et courir:

xtract.bat example.tar.gz

Par défaut, le script vérifie le dossier du script, ainsi que celui de votre système. PATH variable d'environnement pour 7z.exe. Si vous voulez changer l'apparence du contenu, vous pouvez remplacer la variable SevenZipExe en haut du script par celle que vous voulez pour le nom de l'exécutable. (Par exemple, 7za.exe ou 7z-real.exe) Vous pouvez également définir un répertoire par défaut pour l'exécutable en modifiant SevenZipDir. Donc si 7z.exe est à C:\Windows\system32\7z.exevous avez mis:

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

En tout cas, voici le script:

@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
2017-11-26 05:34



Pas que je sache. Je l'ai initialement trouvé dans le référentiel source suivant: github.com/ynkdir/winscript Cela fonctionne, car le moteur WSH WScript ignore apparemment le premier bit, jusqu'à ce que le commentaire commence. Plus d'informations peuvent être trouvées à: stackoverflow.com/questions/4999395/... - Charles Grunwald
a trouvé ceci: javascriptkit.com/javatutors/conditionalcompile2.shtml ce qui semble indiquer que @set @var = value est la syntaxe JScript pour la déclaration des variables à la compilation. Donc, il est à la fois valide JScript et une commande CMD - hdgarrood


Comme vous pouvez le voir, 7-Zip n'est pas très bon à cela. Les gens ont été Demanderopération atomique tarball depuis 2009. Voici un petit programme (490 KB) dans Go ça peut le faire, je compilé pour toi.

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
2017-10-29 18:37