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
最新推荐文章于 2024-05-12 09:32:29 发布