md5r.go 949 B

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