package main import ( "flag" "fmt" "io/ioutil" "log" "strconv" "syscall" ) func get_fileinfo(f string, size bool, mode bool, inode bool) string { var stat syscall.Stat_t var ret string ret = "{\"name\":\"" + f + "\"" if err := syscall.Stat(f, &stat); err != nil { log.Fatal(err) } if size { ret = ret + ", \"size\":" + strconv.FormatInt(stat.Size, 10) } if mode { ret = ret + ", \"mode\":" + strconv.Itoa(int(stat.Mode)) } if inode { ret = ret + ", \"inode\":" + strconv.FormatUint(stat.Ino, 10) } ret = ret + "}" return ret } func main() { // here be the ls flags var a_flag bool // all files, even ones starting with . var mode_flag bool // flags var inode_flag bool // inode var size_flag bool // size var first = true flag.BoolVar(&a_flag, "a", false, "lists all files in directory, even hidden ones") flag.BoolVar(&mode_flag, "f", false, "include flags for file") flag.BoolVar(&inode_flag, "i", false, "include flags for file") flag.BoolVar(&size_flag, "s", false, "include flags for file") // end ls flag flag.Parse() root := "." //flag.Arg(0) dir, _ := ioutil.ReadDir(root) fmt.Printf("[\n") if !a_flag { for _, entry := range dir { if entry.Name()[0] != '.' { if !first { fmt.Printf(",") } else { first = false } fmt.Printf("%s\n", get_fileinfo(entry.Name(), size_flag, mode_flag, inode_flag)) } } } else { for _, entry := range dir { if !first { fmt.Printf(",") } else { first = false } fmt.Printf("%s\n", get_fileinfo(entry.Name(), size_flag, mode_flag, inode_flag)) } } fmt.Printf("]\n") }