diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..27d1535 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.java diff --git a/go-ls b/go-ls new file mode 100755 index 0000000..6c21ee2 Binary files /dev/null and b/go-ls differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d97d577 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module go-linux-tools/go-ls + +go 1.20 + +require github.com/fatih/color v1.15.0 + +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + golang.org/x/sys v0.6.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..2624c9d --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go new file mode 100644 index 0000000..ced6b83 --- /dev/null +++ b/main.go @@ -0,0 +1,130 @@ +package main + +import ( + "flag" + "fmt" + "io/fs" + "os" + "strconv" + + "github.com/fatih/color" +) + +func usage() { + fmt.Fprintf(os.Stderr, "Usage:\n") + os.Exit(1) +} + +func formatFileSize(fi fs.FileInfo) (size string) { + switch fileSizeFloat := float64(fi.Size()); { + + case fileSizeFloat > (1024 * 1024 * 1024): //GB + fileSizeFloat /= (1024 * 1024 * 1024) + size = strconv.FormatFloat(fileSizeFloat, 'f', 1, 64) + return size + "G" + + case fileSizeFloat > (1024 * 1024): //MB + fileSizeFloat /= (1024 * 1024) + size = strconv.FormatFloat(fileSizeFloat, 'f', 1, 64) + return size + "M" + + case fileSizeFloat > 1024: //KB + fileSizeFloat /= 1024 + size = strconv.FormatFloat(fileSizeFloat, 'f', 1, 64) + return size + "K" + + case fileSizeFloat > 0: //B + size = strconv.FormatFloat(fileSizeFloat, 'f', 0, 64) + return size + + default: + return "0" + } +} + +func getFileMod(fi fs.FileInfo) (mod string) { + //day month short time HH:MM + day := strconv.Itoa(fi.ModTime().Day()) + month := fi.ModTime().Month().String() + timeH := strconv.Itoa(fi.ModTime().Hour()) + timeM := strconv.Itoa(fi.ModTime().Minute()) + if len(timeH) <= 1 { + timeH = "0" + timeH + } + if len(timeM) <= 1 { + timeM = "0" + timeM + } + + mod = day + " " + month[0:3] + " " + timeH + ":" + timeM + return mod +} + +func PrintHeaders() { + headersOutput := color.New(color.FgHiBlack).Add(color.Underline) + //headersOutput.Printf("%-10s %7s %5s %11s\n", "Type", "Size", "Time", "Name") //leave this + headersOutput.Printf("%-10s ", "Type") + headersOutput.Printf("%7s ", "Size") + headersOutput.Printf("%5s ", "Time") + headersOutput.Printf("%11s\n", "Name") +} + +func main() { + var flagNoColor = flag.Bool("no-colour", false, "Disable color output") + var flagNoList = flag.Bool("no-l", false, "Disable ls -l output") + var dir string + + flag.Parse() + + if *flagNoColor { + color.NoColor = true + } + + dirOutput := color.New(color.FgCyan, color.Bold) + fileOutput := color.New(color.FgWhite, color.Bold) + + if len(os.Args) == 1 { + dir = "." + } else { + dir = os.Args[1] + } + + files, err := os.ReadDir(dir) + + if err != nil { + usage() + } + if !*flagNoList { + PrintHeaders() + } + + for _, file := range files { + fileName := file.Name() + fileType := file.Type() + dirSize := "-" + fileSize := "" + fileModTime := "" + + fi, err := os.Stat(fileName) + if err != nil { + usage() + } + fileSize = formatFileSize(fi) + fileModTime = getFileMod(fi) + + if !*flagNoList { + if file.IsDir() { + dirOutput.Printf("%s %7s %7s\t%s\n", fileType, dirSize, fileModTime, fileName) //leave this + } else { + fmt.Printf("%7s %7s %4s", fileType, fileSize, fileModTime) + fileOutput.Printf("\t%s\n", fileName) + } + } else { + if file.IsDir() { + dirOutput.Printf("%s\n", fileName) + } else { + fileOutput.Printf("%s\n", fileName) + } + } + + } +}