12 var removeArchives *bool
14 func processPath(curPath string) error {
15 info, err := os.Stat(curPath)
17 return fmt.Errorf("Unable to stat %s: %s", curPath, err.Error())
20 entries, err := os.ReadDir(curPath)
22 return fmt.Errorf("Unable to call readdir on %s: %s", curPath, err.Error())
24 for i := range(entries) {
25 err := processPath(filepath.Join(curPath, entries[i].Name()))
31 extractedBaseName, err := extractIfPossible(curPath)
35 if extractedBaseName != "" {
36 err = processPath(filepath.Join(filepath.Dir(curPath), extractedBaseName))
41 err = os.Remove(curPath)
43 return fmt.Errorf("Unable to remove archive file %s: %s", curPath, err.Error())
45 fmt.Printf("== rm %s\n", curPath)
52 func extractIfPossible(curPath string) (string, error) {
53 if strings.HasSuffix(curPath, ".tgz") {
54 return extractTgz(curPath, ".tgz")
55 } else if strings.HasSuffix(curPath, ".tar.gz") {
56 return extractTgz(curPath, ".tar.gz")
57 } else if strings.HasSuffix(curPath, ".7z") {
58 return extract7z(curPath)
59 } else if strings.HasSuffix(curPath, ".zip") {
60 return extractZip(curPath)
65 func extractTgz(curPath string, suffix string) (string, error) {
66 fmt.Printf("== decompressing tar file %s\n", curPath)
67 cmd := exec.Command("tar", "xvf", filepath.Base(curPath))
68 cmd.Dir = filepath.Dir(curPath)
69 //cmd.Stdout = os.Stdout
72 return "", fmt.Errorf("error running tar xvf on %s: %s", curPath, err.Error())
74 return filepath.Base(curPath[:len(curPath) - len(suffix)]), nil
77 func extract7z(curPath string) (string, error) {
78 fmt.Printf("== decompressing 7z file %s\n", curPath)
79 extractedBaseName := curPath[:len(curPath) - len(".7z")]
80 err := os.Mkdir(extractedBaseName, 0755)
82 return "", fmt.Errorf("unable to mkdir '%s': %s", extractedBaseName, err.Error())
84 absCurPath, err := filepath.Abs(curPath)
86 return "", fmt.Errorf("unable to get absolute path for '%s': %s", curPath, err.Error())
88 absExtractedBaseName, err := filepath.Abs(extractedBaseName)
90 return "", fmt.Errorf("unable to get absolute path for '%s': %s", extractedBaseName, err.Error())
92 cmd := exec.Command("7z", "x", absCurPath)
93 cmd.Dir = absExtractedBaseName
94 //cmd.Stdout = os.Stdout
97 return "", fmt.Errorf("error running 7z on %s: %s", curPath, err.Error())
99 return extractedBaseName, nil
102 func extractZip(curPath string) (string, error) {
103 fmt.Printf("== decompressing zip file %s\n", curPath)
104 extractedBaseName := curPath[:len(curPath) - len(".zip")]
105 err := os.Mkdir(extractedBaseName, 0755)
107 return "", fmt.Errorf("unable to mkdir '%s': %s", extractedBaseName, err.Error())
109 absCurPath, err := filepath.Abs(curPath)
111 return "", fmt.Errorf("unable to get absolute path for '%s': %s", curPath, err.Error())
113 absExtractedBaseName, err := filepath.Abs(extractedBaseName)
115 return "", fmt.Errorf("unable to get absolute path for '%s': %s", extractedBaseName, err.Error())
117 cmd := exec.Command("unzip", absCurPath)
118 cmd.Dir = absExtractedBaseName
119 //cmd.Stdout = os.Stdout
122 return "", fmt.Errorf("error running unzip on %s: %s", curPath, err.Error())
124 return extractedBaseName, nil
128 removeArchives = flag.Bool("r", false, "Remove archive files after decompressing them")
129 flag.Usage = func() {
130 fmt.Printf("recursive_decompress: recursively decompresses a path.\n")
131 fmt.Printf("usage: recursive_decompress [flags] [paths...]\n")
137 if flag.Arg(0) != "" {
138 curPath = flag.Arg(0)
140 err := processPath(curPath)
142 fmt.Printf("error: %s\n", err.Error())