md5r.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
  2. // All rights reserved. Use of this source code is governed by an MIT-style
  3. // license that can be found in the LICENSE file.
  4. // +build ignore
  5. package main
  6. import (
  7. "crypto/md5"
  8. "flag"
  9. "fmt"
  10. "io"
  11. "os"
  12. "path/filepath"
  13. )
  14. var (
  15. long bool
  16. dirs bool
  17. )
  18. func main() {
  19. flag.BoolVar(&long, "l", false, "Long output")
  20. flag.BoolVar(&dirs, "d", false, "Check dirs")
  21. flag.Parse()
  22. args := flag.Args()
  23. if len(args) == 0 {
  24. args = []string{"."}
  25. }
  26. for _, path := range args {
  27. err := filepath.Walk(path, walker)
  28. if err != nil {
  29. fmt.Fprintln(os.Stderr, err)
  30. os.Exit(1)
  31. }
  32. }
  33. }
  34. func walker(path string, info os.FileInfo, err error) error {
  35. if err != nil {
  36. return err
  37. }
  38. if dirs && info.IsDir() {
  39. fmt.Printf("%s %s 0%03o %d\n", "-", path, info.Mode(), info.ModTime().Unix())
  40. } else if !info.IsDir() {
  41. sum, err := md5file(path)
  42. if err != nil {
  43. return err
  44. }
  45. if long {
  46. fmt.Printf("%s %s 0%03o %d\n", sum, path, info.Mode(), info.ModTime().Unix())
  47. } else {
  48. fmt.Printf("%s %s\n", sum, path)
  49. }
  50. }
  51. return nil
  52. }
  53. func md5file(fname string) (hash string, err error) {
  54. f, err := os.Open(fname)
  55. if err != nil {
  56. return
  57. }
  58. defer f.Close()
  59. h := md5.New()
  60. io.Copy(h, f)
  61. hb := h.Sum(nil)
  62. hash = fmt.Sprintf("%x", hb)
  63. return
  64. }