package main import ( "bufio" "bytes" "flag" "fmt" "io" "os" "path/filepath" "sync/atomic" ) var re []byte var count int32 var c, f, d bool var i, p string func main() { flag.StringVar(&p, "p", "./", "-p=finddir") //搜索的目录,默认是当前目录,path flag.StringVar(&i, "r", "", "-r=matchstring") //关键字,index flag.BoolVar(&c, "c", false, "-c=true") //是否在文件内容搜索关键字,content flag.BoolVar(&f, "f", false, "-f=true") //是否根据关键字查找文件,file flag.BoolVar(&d, "d", false, "-d=true") //是否根据关键字查找文件夹,directory flag.Parse() if len(i) == 0 { fmt.Println("关键字不能为空") return } re = []byte(i) if err := filepath.Walk(p, walk); err != nil { fmt.Println("Walk:", err) } if count == 0 { fmt.Println("搜索路径:", p) fmt.Println("关键字:", i) if d { fmt.Println("是否搜索目录:", d) } if f { fmt.Println("是否搜索文件:", f) } if c { fmt.Println("是否搜索内容:", c) } } fmt.Printf("共发现 : %d\n", count) } func walk(path string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { if d && bytes.Contains([]byte(info.Name()), re) { atomic.AddInt32(&count, 1) fmt.Println("匹配到目录:", path) } return nil } if f { if bytes.Contains([]byte(info.Name()), re) { atomic.AddInt32(&count, 1) fmt.Println("匹配到文件:", path) return nil } } if c { return read(path) } return nil } //在文件中查找关键字 func read(path string) error { File, err := os.Open(path) defer File.Close() if err != nil { fmt.Println(path, ":", err) return err } r := bufio.NewReader(File) i := 0 for { i++ b, _, err := r.ReadLine() if bytes.Contains(b, []byte{0}) { //排除二进制文件 return nil } if err != nil { if err == io.EOF { if bytes.Contains(b, re) { atomic.AddInt32(&count, 1) fmt.Printf("在文件:%s第 %d行\n", path, i) fmt.Println(string(bytes.TrimSpace(b))) } return nil } return err } if bytes.Contains(b, re) { atomic.AddInt32(&count, 1) fmt.Printf("在文件:%s第 %d行\n", path, i) fmt.Println(string(bytes.TrimSpace(b))) } } return nil }
版权声明:本文为博主原创文章,未经博主允许不得转载。
Go 1.5关键字搜索目录、文件、文件内容_修复一个小BUG
原文地址:http://blog.csdn.net/fyxichen/article/details/47418523