как я могу распаковать .tar.gz за один шаг (используя 7-zip)?

<p>я использую 7-zip в windows xp и всякий раз, когда я загружаю файл .tar.gz, мне требуется два шага, чтобы полностью извлечь файл (ы).</p><ol> <li>я щелкаю правой кнопкой мыши на<strong> example.tar.gz </strong>file и выбираю<strong> 7-zip -> extract here </strong>из контекстного меню.</li> <li>затем я беру полученный файл<strong> example.tar </strong>и снова щелкаю правой кнопкой мыши и выбираю<strong> 7-zip -> извлечь здесь </strong>из контекстного меню.</li> </ol><p>есть ли способ через контекстное меню сделать это за один шаг?</p>

<p>на самом деле, нет. файл .tar.gz или .tgz на самом деле имеет два формата: <code>.tar</code> - это архив, а <code>.gz</code> - это сжатие. таким образом, первый шаг распаковывается, а второй шаг извлекает архив.</p><p>чтобы сделать все это за один шаг, вам нужна программа <code>tar</code>. <a href="http://www.cygwin.com/">cygwin</a> включает это.</p><pre><code>tar xzvf foobaz.tar.gz ; x = extract ; z = filter through gzip ; v = be verbose (show activity) ; f = filename </code></pre><p>вы также можете сделать это «за один шаг», открыв файл в графическом интерфейсе 7-zip: откройте файл <code>.tar.gz</code>, дважды щелкните включенный файл <code>.tar</code>, а затем извлеките эти файлы в нужное место.</p><p>здесь есть длинная ветка <a href="http://sourceforge.net/p/sevenzip/discussion/45797/thread/5eb1b8d5">здесь</a> людей, которые просят/голосуют за одностадийную обработку файлов tgz и bz2. пока действие отсутствия указывает на то, что этого не произойдет, пока кто-то не предпримет шаги и не внесет значительный вклад (код, деньги, что-то).</p>

<p>старый вопрос, но я боролся с этим сегодня, так что вот мой 2с. средство командной строки 7zip "7z.exe" (у меня установлена версия 9.22) может писать в стандартный вывод и читать из стандартного ввода, так что вы можете обойтись без промежуточного файла tar, используя канал:</p><pre><code>7z x "somename.tar.gz" -so | 7z x -aoa -si -ttar -o"somename" </code></pre><p>куда:</p><pre><code>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 </code></pre><p>см. файл справки (7-zip.chm) в каталоге установки для получения дополнительной информации о командах командной строки и переключателях.</p><p>вы можете создать пункт контекстного меню для файлов .tar.gz/.tgz, который вызывает вышеуказанную команду, используя regedit или сторонний инструмент, такой как <a href="http://tools.tortoisesvn.net/stexbar.html">stexbar</a> .</p>

<p>начиная с 7-zip 9.04, имеется опция командной строки, позволяющая выполнять комбинированное извлечение без использования промежуточного хранилища для простого файла <code>.tar</code>:</p><pre><code>7z x -tgzip -so theinputfile.tgz | 7z x -si -ttar </code></pre><p><code>-tgzip</code> необходим, если входной файл называется <code>.tgz</code> вместо <code>.tar.gz</code>.</p>

<p>как видите, 7-zip не очень хорош в этом. люди <a href="http://sourceforge.net/p/sevenzip/discussion/45797/thread/5eb1b8d5">просят</a> tarball atomic operation с 2009 года. <a href="https://socketloop.com/tutorials/golang-untar-or-extract-tar-ball-archive-example">вот небольшая программа</a> (490 кб) на go, которая может это сделать, я <a href="http://bitbucket.org/svnpenn/a/downloads/go-untar.exe">скомпилировал ее</a> для вас.</p><pre class="lang-golang prettyprint-override"><code>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) } } } </code></pre>

<p>7za работает правильно, как показано ниже:</p><pre><code>7za.exe x d:\pkg-temp\prod-rtx-service.tgz -so | 7za.exe x -si -ttar -od:\pkg-temp\prod-rtx-service </code></pre>