...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package main
17
18 import (
19 "crypto/md5"
20 "flag"
21 "fmt"
22 "io"
23 "log"
24 "os"
25 "path/filepath"
26 )
27
28 func md5SumFile(filename string) ([]byte, error) {
29 var result []byte
30 f, err := os.Open(filename)
31 if err != nil {
32 return result, err
33 }
34 defer f.Close()
35 hash := md5.New()
36 if _, err := io.Copy(hash, f); err != nil {
37 return nil, err
38 }
39 return hash.Sum(result), nil
40 }
41
42 func run(args []string) error {
43
44 flags := flag.NewFlagSet("md5sum", flag.ExitOnError)
45 output := flags.String("output", "", "If set, write the results to this file, instead of stdout.")
46 if err := flags.Parse(args); err != nil {
47 return err
48 }
49
50 to := os.Stdout
51 if *output != "" {
52 f, err := os.Create(*output)
53 if err != nil {
54 return err
55 }
56 defer f.Close()
57 to = f
58 }
59 for _, path := range flags.Args() {
60 walkFn := func(path string, info os.FileInfo, err error) error {
61 if err != nil {
62 return err
63 }
64 if info.IsDir() {
65 return nil
66 }
67
68 if b, err := md5SumFile(path); err != nil {
69 return err
70 } else {
71 fmt.Fprintf(to, "%s %x\n", path, b)
72 }
73 return nil
74 }
75
76 if err := filepath.Walk(path, walkFn); err != nil {
77 return err
78 }
79 }
80 return nil
81 }
82
83 func main() {
84 log.SetFlags(0)
85 log.SetPrefix("GoMd5sum: ")
86 if err := run(os.Args[1:]); err != nil {
87 log.Fatal(err)
88 }
89 }
90
View as plain text