md5r.go 775 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package main
  2. import (
  3. "crypto/md5"
  4. "flag"
  5. "fmt"
  6. "io"
  7. "os"
  8. "path/filepath"
  9. )
  10. func main() {
  11. flag.Parse()
  12. args := flag.Args()
  13. if len(args) == 0 {
  14. args = []string{"."}
  15. }
  16. for _, path := range args {
  17. err := filepath.Walk(path, walker)
  18. if err != nil {
  19. fmt.Fprintln(os.Stderr, err)
  20. os.Exit(1)
  21. }
  22. }
  23. }
  24. func walker(path string, info os.FileInfo, err error) error {
  25. if err != nil {
  26. return err
  27. }
  28. if !info.IsDir() {
  29. sum, err := md5file(path)
  30. if err != nil {
  31. return err
  32. }
  33. fmt.Printf("%s %s\n", sum, path)
  34. }
  35. return nil
  36. }
  37. func md5file(fname string) (hash string, err error) {
  38. f, err := os.Open(fname)
  39. if err != nil {
  40. return
  41. }
  42. defer f.Close()
  43. h := md5.New()
  44. io.Copy(h, f)
  45. hb := h.Sum(nil)
  46. hash = fmt.Sprintf("%x", hb)
  47. return
  48. }