// Author: simon // Author: ynwdlxm@163.com // Date: 2025/1/26 15:33 // Desc: package main import ( "flag" "fmt" "io" "log" "os" "path/filepath" ) var ( f = os.Stdout err error ) type config struct { ext string // extension to filter out size int64 // min file size list bool // list files del bool // delete files wLog io.Writer // log destination writer archive string // archive directory } func main() { // Parsing command line flags root := flag.String("root", ".", "Root directory to start") logFile := flag.String("log", "", "Log deletes to this file") // Action option list := flag.Bool("list", false, "List fies only") // Filter option ext := flag.String("ext", "", "File extension to filter out") size := flag.Int64("size", 0, "Minimum file size") archive := flag.String("archive", "", "Archive directory") del := flag.Bool("del", false, "Delete files") flag.Parse() if *logFile != "" { f, err = os.OpenFile(*logFile, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644) if err != nil { _, _ = fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer func(f *os.File) { err := f.Close() if err != nil { return } }(f) } c := config{ ext: *ext, size: *size, list: *list, del: *del, wLog: f, archive: *archive, } if err := run(*root, os.Stdout, c); err != nil { if _, err := fmt.Fprintln(os.Stderr, err); err != nil { return } os.Exit(1) } } func run(root string, out io.Writer, cfg config) error { delLogger := log.New(cfg.wLog, "DELETE FILE: ", log.LstdFlags) return filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { return nil } if filterOut(path, cfg.ext, cfg.size, info) { return nil } // If list was explicitly set, don't do anything if cfg.list { return listFile(path, out) } // Archive files and continue if successful if cfg.archive != "" { if err := archiveFile(cfg.archive, root, path); err != nil { return err } } // Delete files if cfg.del { return delFile(path, delLogger) } return listFile(path, out) }) }