package main import ( "io/ioutil" "fmt" "flag" "log" "syscall" "strconv" ) 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") }