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") //keyword。index
flag.BoolVar(&c, "c", false, "-c=true") //是否在文件内容搜索keyword,content
flag.BoolVar(&f, "f", false, "-f=true") //是否依据keyword查找文件,file
flag.BoolVar(&d, "d", false, "-d=true") //是否依据keyword查找文件夹,directory
flag.Parse()
if len(i) == 0 {
fmt.Println("keyword不能为空")
return
}
re = []byte(i)
if err := filepath.Walk(p, walk); err != nil {
fmt.Println("Walk:", err)
}
if count == 0 {
fmt.Println("搜索路径:", p)
fmt.Println("keyword:", 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
} //在文件里查找keyword
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.5keyword搜索文件夹、文件、文件内容_修复一个小BUG的更多相关文章

  1. 重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件

    原文:重新想象 Windows 8 Store Apps (22) - 文件系统: 访问文件夹和文件, 通过 AQS 搜索本地文件 [源码下载] 重新想象 Windows 8 Store Apps ( ...

  2. 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件

    [源码下载] 背水一战 Windows 10 (85) - 文件系统: 获取文件夹和文件, 分组文件夹, 排序过滤文件夹和文件, 搜索文件 作者:webabcd 介绍背水一战 Windows 10 之 ...

  3. 使用FileSystemWatcher监控文件夹及文件

    引言 这一周主要精力集中学习一个同事开发的本地文件搜索项目上,其中客户端添加共享文件时主要是使用FileSystemWatcher 监控文件,并在各种事件发生时向服务器发送消息. 解决方法 FileS ...

  4. TortoiseSVN文件夹及文件图标不显示解决方法

              由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图标,这个问题前一段时间就遇到了(那个时 ...

  5. Projects\Portal_Content\Indexer\CiFiles文件夹下文件占用磁盘空间过大问题。

    C:\Program Files\Microsoft Office Servers\12.0\Data\Office Server\Applications\9765757d-15ee-432c-94 ...

  6. [转]TortoiseSVN文件夹及文件图标不显示解决方法

    FROM : http://blog.csdn.net/lishehe/article/details/8257545 由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的 ...

  7. Win7-其中的文件夹或文件已在另一个程序中打开

    Win7-其中的文件夹或文件已在另一个程序中打开 如何解决Win7系统在删除或移动文件时提示,“操作无法完成,因为其中的文件夹或文件已在另一个程序中打开,请关闭该文件夹或文件,然后重试”.   步骤阅 ...

  8. TortoiseSVN文件夹及文件图标不显示解决方法(转发)

    地址:http://blog.csdn.net/lishehe/article/details/8257545 由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能 ...

  9. TortoiseSVN文件夹及文件图标不显示解决方法 [转]

    由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案 ...

随机推荐

  1. tomcat sso 配置

    源: http://www.oecp.cn/hi/single/blog/349 为了实现单点登录,做了个CAS SSO单点登录实例,经过反复的琢磨和修改终于成功了,现将CAS SSO单点登录实例详细 ...

  2. 结合MapReduce和数据集Combining datasets with MapReduce

    While in the SQL-world is very easy combining two or more datasets - we just need to use the JOIN ke ...

  3. 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: SYSTEM

    ylbtech-Oracle:数据库实例: STOREBOOK  >  表空间  >  编辑 表空间: SYSTEM  表空间  >  编辑 表空间: SYSTEM 1. 一般信息返 ...

  4. 使用jquery操作iframe

    1. 内容里有两个ifame <iframe id="leftiframe"...</iframe> <iframe id="mainiframe ...

  5. 第十四章 springboot + profile(不同环境读取不同配置)

    具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...

  6. Valid Parentheses leetcode java

    题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...

  7. Builder 建造者模式 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  8. IOS之Block讲解

    Block,称为代码块,它是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. Block很像匿名方法 ...

  9. 【MySQL】MySQL统计NULL字段处理

    select A.user_id,ifnull(sum(ifnull(A.ex_cpu,0)),0) AS a0, ifnull(sum(ifnull(A.ex_mem,0)),0) AS a1, i ...

  10. tcp协议的端口状态

    Listening Syn_sent syn_rcvd established close_wait time_wait --------- 对方主动关闭(对方调用close()), 我方的状态变为 ...