diff --git a/big/big.go b/big/big.go new file mode 100644 index 0000000..3cc7d17 --- /dev/null +++ b/big/big.go @@ -0,0 +1,31 @@ +package big + +import ( + "fmt" + "io/fs" +) + +func Files(fsys fs.FS, size int64) (int64, error) { + var count int64 + err := fs.WalkDir(fsys, ".", func(p string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + info, err := d.Info() + if err != nil { + return err + } + + fmt.Printf("%s: [%s]\n", info.Name(), ByteCountIEC(info.Size())) + + if info.Size() >= size { + count++ + } + return nil + }) + if err != nil { + return 0, err + } + + return count, nil +} \ No newline at end of file diff --git a/big/bytes.go b/big/bytes.go new file mode 100644 index 0000000..a5b213b --- /dev/null +++ b/big/bytes.go @@ -0,0 +1,31 @@ +package big + +import "fmt" + +func ByteCountSI(b int64) string { + const unit = 1000 + if b < unit { + return fmt.Sprintf("%d B", b) + } + div, exp := int64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + return fmt.Sprintf("%.1f %cB", + float64(b)/float64(div), "kMGTPE"[exp]) +} + +func ByteCountIEC(b int64) string { + const unit = 1024 + if b < unit { + return fmt.Sprintf("%d B", b) + } + div, exp := int64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + return fmt.Sprintf("%.1f %ciB", + float64(b)/float64(div), "KMGTPE"[exp]) +} diff --git a/big/cmd/big/main.go b/big/cmd/big/main.go new file mode 100644 index 0000000..29d73de --- /dev/null +++ b/big/cmd/big/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/davemolk/scripts/big" +) + + +func main() { + var dir string + var size int64 + flag.StringVar(&dir, "d", ".", "directory to start walk") + flag.Int64Var(&size, "s", 0, "minimum file size") + flag.Parse() + + c, err := big.Files(os.DirFS(dir), size) + if err != nil { + fmt.Println(err) + } + fmt.Println(c) +}