| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // 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)
- })
- }
|