/lsd/lsd.go

https://code.google.com/p/simple-shell-utils/ · Go · 78 lines · 63 code · 9 blank · 6 comment · 19 complexity · 0e4f23d620abcd163ecce90d899b2f39 MD5 · raw file

  1. //list directories
  2. //
  3. // lsd(1) lists all directories in the current directory, or in the directories
  4. // specified on the command line. By default it does not display directories
  5. // that begin with a . such as .hg.
  6. package main
  7. import (
  8. "os"
  9. path "path/filepath"
  10. "fmt"
  11. "flag"
  12. "log"
  13. )
  14. var (
  15. ShowDotFiles = flag.Bool(".", false, "list hidden files as well")
  16. Invert = flag.Bool("v", false,
  17. "invert: show only files that are not directories")
  18. )
  19. func lsd(dir string, join, hidedot bool) {
  20. f, err := os.Open(dir)
  21. if err != nil {
  22. log.Println(err)
  23. return
  24. }
  25. for {
  26. stats, err := f.Readdir(100)
  27. if err != nil {
  28. log.Println(err)
  29. }
  30. if len(stats) == 0 {
  31. return
  32. }
  33. for _, stat := range stats {
  34. show := stat.IsDirectory()
  35. if *Invert {
  36. show = !show
  37. }
  38. if !show {
  39. continue
  40. }
  41. if hidedot && stat.Name[0] == '.' {
  42. continue
  43. }
  44. name := stat.Name
  45. if join {
  46. name = path.Join(dir, name)
  47. }
  48. fmt.Println(name)
  49. }
  50. }
  51. }
  52. //Usage: %name %flags dirnames*
  53. func main() {
  54. log.SetFlags(0)
  55. flag.Parse()
  56. hide := !*ShowDotFiles
  57. dirs := flag.Args()
  58. if len(dirs) == 0 {
  59. pwd, err := os.Getwd()
  60. if err != nil {
  61. log.Fatalln(err)
  62. }
  63. lsd(pwd, false, hide)
  64. return
  65. }
  66. for _, dir := range dirs {
  67. lsd(dir, true, hide)
  68. }
  69. }