package main import ( "encoding/json" "fmt" "io/ioutil" "log" "os" "reflect" "sort" "strings" ) func plainList(m map[string][]string, v []string) { for _, value := range v { for _, file := range m[value] { fmt.Println(file) } } } func nestedList(m map[string][]string, v []string) { for i, value := range v { fmt.Println(v[i]) for _, file := range m[value] { fmt.Println(" - ", file) } } } func jsonList(m map[string][]string) { j, err := json.Marshal(m) if err != nil { log.Panicf("Error marshalling JSON. %s", err) } fmt.Printf("%s", j) } func main() { wd, err := os.Getwd() if err != nil { msg := fmt.Sprintf("An error occured getting the current working directory.\n%s", err) fmt.Println(msg) os.Exit(1) } dir, err := ioutil.ReadDir(wd) if err != nil { msg := fmt.Sprintf("An error occured reading the current working directory.\n%s", err) fmt.Println(msg) os.Exit(1) } var m = make(map[string][]string) for _, file := range dir { if !file.IsDir() { fileName := file.Name() ext := strings.Split(fileName, ".") if len(ext) > 1 { m[ext[len(ext)-1]] = append(m[ext[len(ext)-1]], fileName) } if len(ext) == 1 { m["no-ext"] = append(m["no-ext"], fileName) } } } for ext := range m { sort.Strings(m[ext]) } values := reflect.ValueOf(m).MapKeys() var extensions []string for _, value := range values { extensions = append(extensions, value.String()) } sort.Strings(extensions) if len(os.Args) > 1 { switch arg := os.Args[1]; arg { case "plain": plainList(m, extensions) case "nested": nestedList(m, extensions) case "json": jsonList(m) default: fmt.Println("Usage: gls [plain|nested|json]") } } else { nestedList(m, extensions) } }