Source File: go-coreutils/du/main.go

package main

import (
  "fmt"
  "log"
  "flag"
  "io/fs"
  "path/filepath"
)

func StatDir(target_path string) error {
  var cur_dir string
  var cur_size int64

  // NOTE: cover the difference betweeen filepath.WalkDir and fs.WalkDir

  err := filepath.WalkDir(target_path, func (path string, d fs.DirEntry, err error) error {
    if d.IsDir() {
      if cur_dir != path {
        loc := filepath.Join(target_path, cur_dir)
        fmt.Printf("%s %d\n", loc, cur_size / 1024)
        cur_dir = path
        cur_size = 0
      }
    } else {
      info, err := d.Info()
      if err != nil { return nil }
      cur_size += info.Size()
    }

    return nil
  })

  return err
}

func main() {
  flag.Parse()
  paths := flag.Args()

  for _, path := range paths {
    err := StatDir(path)
    if err != nil { log.Fatal(err) }
  }
}