如何使用golang的exec.Cmd命令来处理tar命令?

huangapple go评论114阅读模式
英文:

How to work with tar command using golang exec.Cmd

问题

我有一个tar.gz文件,我需要使用golang解压它。
我尝试过像"archive/tar"这样的库,但是它们给了我一个错误:archive/tar: invalid tar header. 现在我的想法是使用exec运行tar命令并解压tarball,但它总是以代码2退出。

我的代码:

  1. func unpack(tarName string) error {
  2. path, _ := os.Getwd()
  3. //err := Untar(path+"/"+tarName, path+"/")
  4. fmt.Printf(path + "/" + tarName)
  5. cmd := exec.Command("tar", "-xfv", path+"/"+tarName)
  6. cmd.Stdout = os.Stdout
  7. err := cmd.Run()
  8. return err
  9. }
英文:

I have a tar.gz file and i need to unpack it using golang.
I've tried libs like "archive/tar" but they gave me error: archive/tar: invalid tar header. Now my idea was to use exec to run tar command and unpack tarball, but it always exits with code 2.

My code:

  1. func unpack(tarName string) error {
  2. path, _ := os.Getwd()
  3. //err := Untar(path+"/"+tarName, path+"/")
  4. fmt.Printf(path + "/" + tarName)
  5. cmd := exec.Command("tar", "-xfv", path+"/"+tarName)
  6. cmd.Stdout = os.Stdout
  7. err := cmd.Run()
  8. return err
  9. }

答案1

得分: 1

如果您想压缩tar.gz文件,首先需要解压缩gzip。

  1. import (
  2. "archive/tar"
  3. "compress/gzip"
  4. "fmt"
  5. "io"
  6. "log"
  7. "os"
  8. )
  9. func ExtractTarGz(gzipStream io.Reader) {
  10. uncompressedStream, err := gzip.NewReader(gzipStream)
  11. if err != nil {
  12. log.Fatal("ExtractTarGz: NewReader failed")
  13. }
  14. tarReader := tar.NewReader(uncompressedStream)
  15. for true {
  16. header, err := tarReader.Next()
  17. if err == io.EOF {
  18. break
  19. }
  20. if err != nil {
  21. log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
  22. }
  23. switch header.Typeflag {
  24. case tar.TypeDir:
  25. if err := os.Mkdir(header.Name, 0755); err != nil {
  26. log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
  27. }
  28. case tar.TypeReg:
  29. outFile, err := os.Create(header.Name)
  30. if err != nil {
  31. log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
  32. }
  33. if _, err := io.Copy(outFile, tarReader); err != nil {
  34. log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
  35. }
  36. outFile.Close()
  37. default:
  38. log.Fatalf(
  39. "ExtractTarGz: uknown type: %s in %s",
  40. header.Typeflag,
  41. header.Name)
  42. }
  43. }
  44. }
  45. func main() {
  46. r, err := os.Open("./file.tar.gz")
  47. if err != nil {
  48. fmt.Println("error")
  49. }
  50. ExtractTarGz(r)
  51. }
英文:

If you are trying to compress tar.gz file you need first to decompress gzip.

  1. import (
  2. "archive/tar"
  3. "compress/gzip"
  4. "fmt"
  5. "io"
  6. "log"
  7. "os"
  8. )
  9. func ExtractTarGz(gzipStream io.Reader) {
  10. uncompressedStream, err := gzip.NewReader(gzipStream)
  11. if err != nil {
  12. log.Fatal("ExtractTarGz: NewReader failed")
  13. }
  14. tarReader := tar.NewReader(uncompressedStream)
  15. for true {
  16. header, err := tarReader.Next()
  17. if err == io.EOF {
  18. break
  19. }
  20. if err != nil {
  21. log.Fatalf("ExtractTarGz: Next() failed: %s", err.Error())
  22. }
  23. switch header.Typeflag {
  24. case tar.TypeDir:
  25. if err := os.Mkdir(header.Name, 0755); err != nil {
  26. log.Fatalf("ExtractTarGz: Mkdir() failed: %s", err.Error())
  27. }
  28. case tar.TypeReg:
  29. outFile, err := os.Create(header.Name)
  30. if err != nil {
  31. log.Fatalf("ExtractTarGz: Create() failed: %s", err.Error())
  32. }
  33. if _, err := io.Copy(outFile, tarReader); err != nil {
  34. log.Fatalf("ExtractTarGz: Copy() failed: %s", err.Error())
  35. }
  36. outFile.Close()
  37. default:
  38. log.Fatalf(
  39. "ExtractTarGz: uknown type: %s in %s",
  40. header.Typeflag,
  41. header.Name)
  42. }
  43. }
  44. }
  45. func main() {
  46. r, err := os.Open("./file.tar.gz")
  47. if err != nil {
  48. fmt.Println("error")
  49. }
  50. ExtractTarGz(r)
  51. }
  52. </details>

huangapple
  • 本文由 发表于 2022年5月16日 07:56:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/72252992.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定