package main import ( "crypto/md5" "fmt" "io" "io/ioutil" "log" "os" "path/filepath" "strings" ) func md5Sum(fullpath string) []uint8 { hasher := md5.New() file, err := os.Open(fullpath) if err != nil { log.Fatal(err) } defer file.Close() if _, err := io.Copy(hasher, file); err != nil { // It's a directory return []uint8{0} } return hasher.Sum(nil) } func printDir(fullpath string, entry os.FileInfo, indent int) { fullpath = filepath.Join(fullpath, entry.Name()) digest := md5Sum(fullpath) fmt.Printf("%s %x %s\n", strings.Repeat("-", indent), digest, entry.Name()) if entry.IsDir() { printDirs(fullpath, indent+1) } } func printDirs(fullpath string, indent int) { dirs, _ := ioutil.ReadDir(fullpath) for _, entry := range dirs { printDir(fullpath, entry, indent) } } func main() { printDirs(".", 0) }