Browse Source

Fixed it to properly remove directories once empty

Also added help, no-remove
Apollo 1 year ago
parent
commit
803247e6c5
1 changed files with 125 additions and 5 deletions
  1. 125 5
      main.go

+ 125 - 5
main.go

@@ -35,7 +35,7 @@ func scan_dir(dir string) ([]string, error) {
 				r = append(r, elem.Name())
 				continue
 			}
-			if strings.HasSuffix(elem.Name(), ".info") {
+			if strings.HasSuffix(elem.Name(), ".info") || strings.HasSuffix(elem.Name(), ".txt") {
 				continue
 			}
 			r = append(r, elem.Name())
@@ -44,7 +44,45 @@ func scan_dir(dir string) ([]string, error) {
 	return r, nil
 }
 
+func is_empty(dir string) bool {
+	ls, err := os.ReadDir(dir)
+	if err != nil {
+		return false
+	}
+	for _, elem := range ls {
+		if elem.IsDir() {
+			return is_empty(filepath.Join(dir, elem.Name()))
+		}
+		if strings.HasSuffix(elem.Name(), ".srt") {
+			if !KEEP_SRT {
+				continue
+			}
+			return false
+		}
+		if strings.HasSuffix(elem.Name(), ".info") || strings.HasSuffix(elem.Name(), ".txt") {
+			continue
+		}
+		return false
+	}
+	return true
+}
+
+func scan_for_dirs(dir string) ([]string, error) {
+	var r []string = []string{}
+	ls, err := os.ReadDir(dir)
+	if err != nil {
+		return nil, err
+	}
+	for _, elem := range ls {
+		if elem.IsDir() && is_empty(filepath.Join(dir, elem.Name())) {
+			r = append(r, filepath.Join(dir, elem.Name()))
+		}
+	}
+	return r, nil
+}
+
 func main() {
+	var REMOVE bool = true
 	// Keeps
 	if len(os.Args) != 1 {
 		for idx, arg := range os.Args {
@@ -54,11 +92,34 @@ func main() {
 			switch strings.ToLower(arg) {
 			case "srt":
 				KEEP_SRT = true
+			case "norm", "no-rm", "no-remove":
+				REMOVE = false
+			case "help", "h", "?":
+				fmt.Println("--- Help ---")
+				fmt.Println("undir will move 1 or more files from a directory, then delete the directory.")
+				fmt.Println("")
+				fmt.Println("Commands:")
+				fmt.Println("")
+				fmt.Println(" srt                        undir will move *.srt files")
+				fmt.Println(" norm, no-rm, no-remove     undir will NOT remove directories or files")
+				fmt.Println(" help, h, ?                 Prints this help screen and exits (code 0, success)")
+				fmt.Println("")
+				fmt.Println("Example Usage:")
+				fmt.Println("")
+				fmt.Println("undir                       Standard run of undir, will move any file NOT *.info or *.srt")
+				fmt.Println("undir srt                   Run undir but move *.srt files")
+				fmt.Println("undir no-rm                 Run undir but do NOT remove directories or files, simply copy them")
+				fmt.Println("undir srt norm              Run undir but move *.srt files, also do NOT remove directories or files, simply copy them")
+				fmt.Println("undir ?                     Prints this help screen and exits (code 0, success)")
+				os.Exit(0)
 			}
 		}
 		if KEEP_SRT {
 			fmt.Println("Keeping .srt's")
 		}
+		if !REMOVE {
+			fmt.Println("No Remove Mode")
+		}
 	}
 	actions, err := scan_dir(".")
 	if err != nil {
@@ -66,7 +127,7 @@ func main() {
 		return
 	}
 	fmt.Println("Found:", len(actions))
-	for _, a := range actions {
+	for idx, a := range actions {
 		fmt.Println(a)
 		out, err := os.Create(filepath.Base(a))
 		if err != nil {
@@ -76,6 +137,7 @@ func main() {
 		in, err := os.Open(a)
 		if err != nil {
 			out.Close()
+			fmt.Println("RM", filepath.Base(a))
 			err1 := os.Remove(filepath.Base(a))
 			if err1 != nil {
 				fmt.Println("Err (Cleanup):", err1)
@@ -87,6 +149,7 @@ func main() {
 		if err != nil {
 			in.Close()
 			out.Close()
+			fmt.Println("RM", filepath.Base(a))
 			err1 := os.Remove(filepath.Base(a))
 			if err1 != nil {
 				fmt.Println("Err (Cleanup):", err1)
@@ -94,9 +157,66 @@ func main() {
 			fmt.Println("Err (Copy in -> out):", err)
 			continue
 		}
-		err = os.RemoveAll(filepath.Dir(a))
-		if err != nil {
-			fmt.Println("Err (Remove):", err)
+		if idx+1 < len(actions) {
+			fmt.Println("End?")
+			if REMOVE {
+				fmt.Println("RM", filepath.Dir(a))
+				err = os.RemoveAll(filepath.Dir(a))
+				if err != nil {
+					fmt.Println("Err (Remove):", err)
+				}
+				var can_clean bool = true
+				for _, next := range actions[idx+1:] {
+					if filepath.Dir(next) == filepath.Dir(a) {
+						can_clean = false
+					}
+				}
+				if can_clean {
+					new_scan, err := scan_for_dirs(".")
+					if err != nil {
+						fmt.Println("Err (Rescan):", err)
+						continue
+					}
+					if len(new_scan) != 0 {
+						for _, elem := range new_scan {
+							fmt.Println("RM", elem)
+							err = os.RemoveAll(elem)
+							if err != nil {
+								fmt.Println("Err (Remove):", err)
+							}
+						}
+					}
+				}
+			}
+			continue
+		}
+		var can_clean bool = true
+		for _, next := range actions[idx+1:] {
+			if filepath.Dir(next) == filepath.Dir(a) {
+				can_clean = false
+			}
+		}
+		if can_clean && REMOVE {
+			fmt.Println("RM", filepath.Dir(a))
+			err = os.RemoveAll(filepath.Dir(a))
+			if err != nil {
+				fmt.Println("Err (Remove):", err)
+				continue
+			}
+			new_scan, err := scan_for_dirs(".")
+			if err != nil {
+				fmt.Println("Err (Rescan):", err)
+				continue
+			}
+			if len(new_scan) != 0 {
+				for _, elem := range new_scan {
+					fmt.Println("RM", elem)
+					err = os.RemoveAll(elem)
+					if err != nil {
+						fmt.Println("Err (Remove):", err)
+					}
+				}
+			}
 		}
 	}
 }