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. Android之多媒体扫描过程

    转自:http://blog.csdn.net/yan8024/article/details/6620359下面是系统图      MediaScannerReceiver会在任何的ACTION_B ...

  2. JMS基本概念之一

    The Java Message Service(JMS) API is a messaging standard that allows application components based o ...

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

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

  4. iOS:删除、插入、移动单元格

    删除.插入.移动单元格的具体实例如下:   代码如下: #import "ViewController.h" #define NUM 20 typedef enum { delet ...

  5. go语言基础之结构体成员的使用指针变量

    1.结构体成员的使用:指针变量 示例: package main //必须有个main包 import "fmt" //定义一个结构体类型 type Student struct ...

  6. Jquery 获取第一个子元素

    <ul>  <li>John</li>  <li>Karl</li>  <li>Brandon</li></u ...

  7. Android 如何修改默认输入法

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  8. Linux系统多网卡绑定实战

    导读 对于服务器来说,网络设备的稳定也是比较重要的,特别是网卡.在生产型的系统中,网卡的可靠性就更为重要了. 多块网卡绑定到一个IP地址,当一块网卡发生物理性损坏的情况下,另一块网卡自动启用,并提供正 ...

  9. 如何将DB2的数据库转换到mySQL中?

    经过几次尝试最终找到解决的办法,因为网上并没有详细说明,所以下面我将详细的步骤记录如下: 1. 大前提是你已经安装好DB2服务器和mySQL服务器,现在只是借用Navicat for MySQL这个软 ...

  10. SharePoint 2013网站突然不能登录了。

    SharePoint 2013网站突然不能登录了,访问的时候,总是报错: The list has not shared with you.   原因: 原来我不知道什么时候把web applicat ...