package main import ( "flag" "os/exec" "path/filepath" "fmt" "os" "strings" ) var removeArchives *bool func processPath(curPath string) error { info, err := os.Stat(curPath) if err != nil { return fmt.Errorf("Unable to stat %s: %s", curPath, err.Error()) } if info.IsDir() { entries, err := os.ReadDir(curPath) if err != nil { return fmt.Errorf("Unable to call readdir on %s: %s", curPath, err.Error()) } for i := range(entries) { err := processPath(filepath.Join(curPath, entries[i].Name())) if err != nil { return err } } } else { tarBaseName := tarBaseName(curPath) if tarBaseName != "" { err = applyTarOn(curPath) if err != nil { return err } err = processPath(filepath.Join(filepath.Dir(curPath), tarBaseName)) if err != nil { return err } if *removeArchives { err = os.Remove(curPath) if err != nil { return fmt.Errorf("Unable to remove archive file %s: %s", curPath, err.Error()) } fmt.Printf("== rm %s\n", curPath) } } } return nil } func tarBaseName(curPath string) string { if strings.HasSuffix(curPath, ".tgz") { return filepath.Base(curPath[:len(curPath)-4]) } return "" } func applyTarOn(curPath string) error { fmt.Printf("== decompressing tar file %s\n", curPath) cmd := exec.Command("tar", "xvf", filepath.Base(curPath)) cmd.Dir = filepath.Dir(curPath) //cmd.Stdout = os.Stdout err := cmd.Run() if err != nil { return fmt.Errorf("error running tar xvf on %s: %s", curPath, err.Error()) } return nil } func main() { removeArchives = flag.Bool("r", false, "Remove archive files after decompressing them") flag.Usage = func() { fmt.Printf("recursive_decompress: recursively decompresses a path.\n") fmt.Printf("usage: recursive_decompress [flags] [paths...]\n") fmt.Printf("\n") flag.PrintDefaults() } flag.Parse() curPath := "." if flag.Arg(0) != "" { curPath = flag.Arg(0) } err := processPath(curPath) if err != nil { fmt.Printf("error: %s\n", err.Error()) os.Exit(1) } os.Exit(0) }