From f54892934f81fe924ce5a7a42e38ecd7581f5c37 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Mon, 20 Oct 2025 13:44:24 -0400 Subject: [PATCH] The du command is implemented. --- du/.gitignore | 2 ++ du/Makefile | 4 ++++ du/go.mod | 3 +++ du/main.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ stat/main.go | 1 + 5 files changed, 55 insertions(+) create mode 100644 du/.gitignore create mode 100644 du/Makefile create mode 100644 du/go.mod create mode 100644 du/main.go diff --git a/du/.gitignore b/du/.gitignore new file mode 100644 index 0000000..d7195f9 --- /dev/null +++ b/du/.gitignore @@ -0,0 +1,2 @@ +du +du.exe diff --git a/du/Makefile b/du/Makefile new file mode 100644 index 0000000..bea7546 --- /dev/null +++ b/du/Makefile @@ -0,0 +1,4 @@ + + +build: + go build . diff --git a/du/go.mod b/du/go.mod new file mode 100644 index 0000000..8e3f2dd --- /dev/null +++ b/du/go.mod @@ -0,0 +1,3 @@ +module lcthw.dev/go/go-coreutils/du + +go 1.25.3 diff --git a/du/main.go b/du/main.go new file mode 100644 index 0000000..5ce938f --- /dev/null +++ b/du/main.go @@ -0,0 +1,45 @@ +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) } + } +} diff --git a/stat/main.go b/stat/main.go index 94f75d7..e4d0b31 100644 --- a/stat/main.go +++ b/stat/main.go @@ -23,6 +23,7 @@ func main() { for _, fname := range files { f, err := os.Open(fname) if err != nil { log.Fatal(err) } + defer f.Close() stats, err := f.Stat() if err != nil { log.Fatal(err) }