main.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // Author: simon
  2. // Author: ynwdlxm@163.com
  3. // Date: 2025/1/26 15:33
  4. // Desc:
  5. package main
  6. import (
  7. "flag"
  8. "fmt"
  9. "io"
  10. "log"
  11. "os"
  12. "path/filepath"
  13. )
  14. var (
  15. f = os.Stdout
  16. err error
  17. )
  18. type config struct {
  19. ext string // extension to filter out
  20. size int64 // min file size
  21. list bool // list files
  22. del bool // delete files
  23. wLog io.Writer // log destination writer
  24. archive string // archive directory
  25. }
  26. func main() {
  27. // Parsing command line flags
  28. root := flag.String("root", ".", "Root directory to start")
  29. logFile := flag.String("log", "", "Log deletes to this file")
  30. // Action option
  31. list := flag.Bool("list", false, "List fies only")
  32. // Filter option
  33. ext := flag.String("ext", "", "File extension to filter out")
  34. size := flag.Int64("size", 0, "Minimum file size")
  35. archive := flag.String("archive", "", "Archive directory")
  36. del := flag.Bool("del", false, "Delete files")
  37. flag.Parse()
  38. if *logFile != "" {
  39. f, err = os.OpenFile(*logFile, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0644)
  40. if err != nil {
  41. _, _ = fmt.Fprintln(os.Stderr, err)
  42. os.Exit(1)
  43. }
  44. defer func(f *os.File) {
  45. err := f.Close()
  46. if err != nil {
  47. return
  48. }
  49. }(f)
  50. }
  51. c := config{
  52. ext: *ext,
  53. size: *size,
  54. list: *list,
  55. del: *del,
  56. wLog: f,
  57. archive: *archive,
  58. }
  59. if err := run(*root, os.Stdout, c); err != nil {
  60. if _, err := fmt.Fprintln(os.Stderr, err); err != nil {
  61. return
  62. }
  63. os.Exit(1)
  64. }
  65. }
  66. func run(root string, out io.Writer, cfg config) error {
  67. delLogger := log.New(cfg.wLog, "DELETE FILE: ", log.LstdFlags)
  68. return filepath.Walk(root,
  69. func(path string, info os.FileInfo, err error) error {
  70. if err != nil {
  71. return nil
  72. }
  73. if filterOut(path, cfg.ext, cfg.size, info) {
  74. return nil
  75. }
  76. // If list was explicitly set, don't do anything
  77. if cfg.list {
  78. return listFile(path, out)
  79. }
  80. // Archive files and continue if successful
  81. if cfg.archive != "" {
  82. if err := archiveFile(cfg.archive, root, path); err != nil {
  83. return err
  84. }
  85. }
  86. // Delete files
  87. if cfg.del {
  88. return delFile(path, delLogger)
  89. }
  90. return listFile(path, out)
  91. })
  92. }