md5r.go 1.1 KB

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