package main import ( "crypto/sha256" "encoding/base64" "fmt" "io" "os" "path/filepath" ) func main() { filesMap := newFilesMap() for _, path := range os.Args[1:] { filepath.Walk(path, func(path string, info os.FileInfo, err error) error { filesMap.Add(path, info) return nil }) fmt.Println(path) } } type filesMap struct { Files map[int64]map[string]*fileEntry } func (fm *filesMap) Add(path string, info os.FileInfo) { fileInfo := &fileEntry{ Path: path, Size: info.Size(), } existing := fm.Files[fileInfo.Size] if existing == nil { existing = map[string]*fileEntry{} fm.Files[fileInfo.Size] = existing existing[""] = fileInfo return } fmt.Println("Dupes: " + path) fmt.Println(existing[""]) fm.Files[fileInfo.Size] = nil } func newFilesMap() filesMap { return filesMap{ Files: map[int64]map[string]*fileEntry{}, } } type fileEntry struct { Path string Size int64 } func calculateHash(path string) (string, error) { f, err := os.Open(path) if err != nil { return "", err } defer f.Close() h := sha256.New() if _, err := io.Copy(h, f); err != nil { return "", err } return base64.RawStdEncoding.EncodeToString(h.Sum(nil)), nil }