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

本文介绍了一个使用Go语言编写的实用工具,该工具能够帮助开发者在指定目录下搜索包含特定关键字的文件或文件夹,并提供了多种搜索选项。通过简单的命令行参数配置,可以指定搜索范围、目标类型及搜索模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值