-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathscan.go
52 lines (41 loc) · 938 Bytes
/
scan.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
package main
import (
"os"
"path/filepath"
"regexp"
)
type sameSizeFiles []string
func scanDir(root string, ignoreNames map[string]struct{}, ignoreRegex *regexp.Regexp) (map[int64]sameSizeFiles, error) {
filesBySize := make(map[int64]sameSizeFiles)
err := filepath.WalkDir(root, func(path string, d os.DirEntry, err error) error {
if err != nil {
return err
}
base := filepath.Base(path)
if _, ignored := ignoreNames[base]; ignored {
if d.IsDir() {
return filepath.SkipDir
}
return nil
}
if ignoreRegex != nil && ignoreRegex.MatchString(path) {
if d.IsDir() {
return filepath.SkipDir
}
return nil
}
if d.IsDir() || d.Type()&os.ModeSymlink != 0 {
return nil
}
finfo, err := d.Info()
if err != nil {
return err
}
filesBySize[finfo.Size()] = append(filesBySize[finfo.Size()], path)
return nil
})
if err != nil {
return nil, err
}
return filesBySize, nil
}