أستخدم 7-Zip على نظام التشغيل Windows XP وكلما قمت بتنزيل ملف .tar.gz يستغرق الأمر خطوتين لاستخراج الملف (الملفات) بالكامل.
هل هناك طريقة من خلال قائمة السياق للقيام بذلك في خطوة واحدة؟
ليس صحيحا. إن ملف .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: افتح الملف .tar.gz
، وانقر نقرًا مزدوجًا فوق الملف .tar
المضمن ، ثم قم باستخراج هذه الملفات إلى موقعك الذي تختاره.
هناك خيط تشغيل طويل هنا من الأشخاص الذين يسألون/يصوتون من أجل معالجة خطوة واحدة لملفات tgz و bz2. يشير عدم وجود إجراء حتى الآن إلى أنه لن يحدث حتى يخطو شخص ما ويساهم بشكل مفيد (الرمز ، المال ، شيء ما).
سؤال قديم ، لكنني كنت أواجهه اليوم لذا ها هي 2c. يمكن لأداة سطر الأوامر 7Zip "7z.exe" (لدي تثبيت الإصدار 9.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) في دليل التثبيت لمزيد من المعلومات حول أوامر ومفاتيح سطر الأوامر.
يمكنك إنشاء إدخال قائمة سياق لملفات .tar.gz/.tgz التي تستدعي الأمر أعلاه باستخدام أداة رجديت أو أداة خارجية مثل stexbar .
بدءًا من 7-Zip 9.04 ، يوجد خيار لسطر الأوامر للقيام بعملية الاستخراج المدمجة دون استخدام التخزين الوسيط لملف .tar
العادي:
7z x -tgzip -so theinputfile.tgz | 7z x -si -ttar
-tgzip
مطلوبة إذا تم تسمية ملف الإدخال .tgz
بدلاً من .tar.gz
.
أنت تستخدم نظام التشغيل Windows XP ، لذلك يجب تثبيت Windows Scripting Host افتراضيًا. مع ما يقال ، إليك نص WSH JScript للقيام بما تحتاجه. ما عليك سوى نسخ الرمز إلى اسم ملف xtract.bat أو شيء ما على طول هذه الخطوط (يمكن أن يكون مهما كان طوله ملحق .bat
) ، ثم قم بتشغيل :
xtract.bat example.tar.gz
بشكل افتراضي ، سوف يتحقق البرنامج النصي من مجلد البرنامج النصي ، بالإضافة إلى متغير البيئة PATH
الخاص بنظامك لـ 7z.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);
كما ترون 7 الرمز البريدي ليست جيدة جدا في هذا. لقد كان الناس يسألون عن عملية ذرية للقارورة منذ عام 2009. إليك برنامج صغير (490 كيلوبايت) في Go يمكنه القيام بذلك ، قمت بتجميعه من أجلك.
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)
}
}
}
بدءاً من نظام التشغيل Windows 10 build 17063 ، يتم دعم tar
و curl
، وبالتالي فمن الممكن فك ضغط ملف .tar.gz في خطوة واحدة باستخدام أمر tar
، كما يلي.
tar -xzvf your_archive.tar.gz
اكتب tar --help
لمزيد من المعلومات حول tar
.
7za يعمل بشكل صحيح على النحو التالي:
7za.exe x D:\pkg-temp\Prod-Rtx-Service.tgz -so | 7za.exe x -si -ttar -oD:\pkg-temp\Prod-Rtx-Service