-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
90 lines (76 loc) · 1.63 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
import (
"flag"
"fmt"
"io"
"io/fs"
"log"
"os"
"path/filepath"
)
type config struct {
ext string
size int64
list bool
del bool
wLog io.Writer
archive string
}
func main() {
root := flag.String("root", ".", "root directory to start")
logFile := flag.String("log", "", "log deletes to this file")
list := flag.Bool("list", false, "list files only")
del := flag.Bool("del", false, "delete files")
ext := flag.String("ext", "", "file extension to filter out")
size := flag.Int64("size", 0, "minimum file size")
archive := flag.String("archive", "", "archive directory")
flag.Parse()
var (
f = os.Stdout
err error
)
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 f.Close()
}
c := config{
ext: *ext,
size: *size,
list: *list,
del: *del,
wLog: f,
archive: *archive,
}
if err := run(*root, os.Stdout, c); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func run(root string, out io.Writer, cfg config) error {
delLogger := log.New(cfg.wLog, "DELETED FILE: ", log.LstdFlags)
return filepath.Walk(root,
func(path string, info fs.FileInfo, err error) error {
if err != nil {
return err
}
if filterOut(path, cfg.ext, cfg.size, info) {
return nil
}
if cfg.list {
return listFile(path, out)
}
if cfg.archive != "" {
if err := archiveFile(cfg.archive, root, path); err != nil {
return err
}
}
if cfg.del {
return delFile(path, delLogger)
}
return listFile(path, out)
})
}