1 package main
2
3 import (
4 "fmt"
5 "io/ioutil"
6 "os"
7 "path/filepath"
8 "strings"
9 )
10
11 var matchCount = 0
12 var ch = make(chan int, 512)
13
14 func findFile(path string, text string) {
15 var pathArray [100]string
16 var count = 0
17 filepath.Walk(path, func(path string, info os.FileInfo, err error) error {
18 if err != nil {
19 }
20 //find text
21 if !info.IsDir() {
22 if info.Size() < 1024*1024 {
23 pathArray[count] = path
24 count++
25 if count >= 100 {
26 count = 0
27 go findText(pathArray[0:100], text)
28 <-ch
29 }
30 }
31 }
32 return nil
33 })
34 go findText(pathArray[0:count], text)
35 <-ch
36
37 fmt.Printf("一共发现了 %d 个匹配的文件", matchCount)
38
39 }
40
41 func findText(paths []string, text string) {
42 for _, path := range paths {
43 fi, err := os.Open(path)
44 if err != nil {
45 panic(err)
46 }
47 defer fi.Close()
48 fd, err := ioutil.ReadAll(fi)
49 if err != nil {
50 panic(err)
51 }
52
53 if strings.Index(string(fd), text) > -1 {
54 matchCount++
55 fmt.Println(path)
56 }
57 }
58 ch <- 1
59 }
60
61 func main() {
62 args := os.Args
63 if len(args) < 3 {
64 fmt.Println("需要两个参数 path text")
65 return
66 }
67 path := args[1]
68 text := args[2]
69
70 _, err := os.Stat(path)
71
72 if err != nil {
73 fmt.Println("path不存在")
74 } else {
75 findFile(path, text)
76 }
77 }
计数器增加的时候应该加锁