A short program to show how to write TAR-GZ and TAR-XZ (LZMA) archives. Note that I have not included an example for TAR-BZ2 because there is no easily-findable public library for doing so.
package main import ( "archive/tar" "compress/gzip" "fmt" "os" "io" "time" "github.com/ulikunitz/xz" ) func addFile(tw *tar.Writer, filepath string) { data := fmt.Sprintf("I am data: %s\n", filepath) h := new(tar.Header) h.Name = filepath h.Size = int64(len(data)) h.Mode = int64(0666) h.ModTime = time.Now() // write the header to the tarball archive if err := tw.WriteHeader(h); err != nil { panic(err) } // copy the file data to the tarball if _, err := io.WriteString(tw, data); err != nil { panic(err) } } func createTarGz() { f, err := os.Create("output.tar.gz") if err != nil { panic(err) } defer f.Close() gw := gzip.NewWriter(f) defer gw.Close() tw := tar.NewWriter(gw) defer tw.Close() addFile(tw, "aa") addFile(tw, "bb/cc") } func createTarXz() { f, err := os.Create("output.tar.xz") if err != nil { panic(err) } defer f.Close() xw, err := xz.NewWriter(f) if err != nil { panic(err) } defer xw.Close() tw := tar.NewWriter(xw) defer tw.Close() addFile(tw, "dd") addFile(tw, "ee/ff") } func main() { createTarGz() createTarXz() }
Examine the outputs:
$ tar tzf output.tar.gz aa bb/cc $ tar xz -O - -f output.tar.gz aa I am data: aa $ tar xz -O - -f output.tar.gz bb/cc I am data: bb/cc $ tar tJf output.tar.xz dd ee/ff I am data: bb/cc $ tar xJ -O - -f output.tar.xz dd I am data: dd $ tar xJ -O - -f output.tar.xz ee/ff I am data: ee/ff