package main import ( "flag" "fmt" "io/fs" "log" "os" "path/filepath" "regexp" ) func main() { fl := flag.NewFlagSet("fixpths", flag.ExitOnError) pth := fl.String("p", "", "Path to scan and fix windows incompatible chars on") rename := fl.Bool("rename", false, "Whether or not to actually rename the files to work on windows") fl.Parse(os.Args[1:]) if *pth == "" { fmt.Println("need a path") os.Exit(2) } invalidChars := regexp.MustCompile(`(<|>|:|\||"|\\|\*|\?)`) err := filepath.WalkDir(*pth, func(path string, d fs.DirEntry, err error) error { if d.IsDir() { return nil } if invalidChars.MatchString(path) { if !*rename { fmt.Printf("%s\n", invalidChars.ReplaceAllString(path, "\033[1;31m${1}\033[0m")) } if *rename { npath := invalidChars.ReplaceAllString(path, "_") err := os.Rename(path, npath) fmt.Printf("%s->%s\n", path, npath) if err != nil { log.Println(err) } } } return nil }) if err != nil { log.Println(err) } }