加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go 1.5关键字搜索目录、文件、文件内容_修复一个小BUG

发布时间:2020-12-16 18:40:29 所属栏目:大数据 来源:网络整理
导读:package mainimport ("bufio""bytes""flag""fmt""io""os""path/filepath""sync/atomic")var re []bytevar count int32var c,f,d boolvar i,p stringfunc main() {flag.StringVar(p,"p","./","-p=finddir") //搜索的目录,默认是当前目录,pathflag.StringVar
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","-f=true")       //是否根据关键字查找文件,file
	flag.BoolVar(&d,"d","-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("共发现 : %dn",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()),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,1)
			fmt.Printf("在文件:%s第 %d行n",i)
			fmt.Println(string(bytes.TrimSpace(b)))
		}
	}
	return nil
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读