我是Powershell的新手,我正在尝试编写一个脚本来提取.tar.gz文件。
解压缩文件需要 2 个步骤。
# Create a .tar file
7z.exe a -ttar files.tar *.txt
7z.exe a -tgzip files.tar.gz files.tar
# These 2 work
& 'C:Program Files7-Zip7z.exe' e .files.tar.gz
& 'C:Program Files7-Zip7z.exe' x -aoa -ttar .files.tar -o'c:foobar'
我正在尝试将这两个命令合并为一个命令,以便我可以跳过将files.tar
文件写入磁盘。
但是,当我尝试组合这些功能时,我收到错误消息"功能不正确"
有没有办法将这 2 个 7zip 命令合并为 1?
& 'C:Program Files7-Zip7z.exe' e .files.tar.gz -so | & 'C:Program Files7-Zip7z.exe' x -aoa -ttar -si -o'c:foobar'
如您所见,7-Zip在这方面不是很好。人们一直在要求自2009年以来的压缩包原子操作。这是一个小程序(490 KB)在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)
}
}
}
如果你安装了python,你可以找到这个代码很方便:
$path = 'C:yourPythonFile.py'
$str = "import tarfile",
"tar = tarfile.open(""C:/yourTarFile.tar"")",
"tar.extractall(""."")",
"tar.close()"
[System.IO.File]::WriteAllLines($path, $str)
cd C:
python yourPythonFile.py