一.查找关键字工具findkw
日常开发中,数据库表删除/表字段修改后,如果代码里继续使用就会导致异常,使用工具去扫描代码检测废弃的表/字段是否存在代码里比依靠记忆要靠谱的多
二.findkw(find key word简称)支持的功能
支持扫描指定的磁盘路径 支持扫描指定的文本文件扩展名.txt/.xml/.json/.py/.go/.java等 支持扫描多个关键字,以英文逗号分隔 支持传入关键字文件(关键字过多,放入一个文件里面)
命令行参数 findtype 不传即可 =2的时候是特定查找
Usage of findkw:
-endflag string
文件扩展名 (default ".py")
-f string
检测目录目录 (default ".")
-findtype string (default "1")
=2的时候找含有$kw,不含z_etl.$kw的文件
-folder string
检测目录目录 (default ".")
-kwfile string
关键字存放的文件
-kws string
检测的关键字 多个以逗号分隔 (default "zo_fund_basic")
三.demo
1.查找 /data/下所有python文件 包含 zo_fund_basic,zo_gp_basic关键字的文件:
./findkw -f /data/ --kws "zo_fund_basic,zo_gp_basic" -endflag ".py"

2.查找 /data/下所有go文件 包含 Unmarshal关键字的文件:
./findkw -f /data/ --kws "Unmarshal" -endflag ".go" |grep -v [0-9]

四.原理
1.递归遍历传入的folder参数(磁盘路径)
2.找到路径下所有扩展名以endflag参数为结尾的文件
3.读取文件内容content,对关键词列表循环,判断是否存在于content里,存在则输出,都不存在输出检测通过
五.使用go语言并发遍历目录
有个坑,服务器使用软连接的文件夹,os模块当成是一个普通文件不再遍历,因此递归文件目录使用了ioutil.ReadDir,对nextPath 继续递归函数
package findkw
import (
"fmt"
zeronewp "github.com/chengcxy/gotools/workpool"
"io/ioutil"
"path"
"strings"
)
type CheckKw struct {
Folder string
Kws []string
EndFlag string
FindType string
}
func NewCheckKw(Folder,kws,EndFlag,KwFile,FindType string)*CheckKw{
ck := &CheckKw{
Folder:Folder,
EndFlag:EndFlag,
FindType:FindType,
}
if KwFile != ""{
ck.getKwsByFile(KwFile)
}else{
Kws := make([]string,0)
if strings.Contains(kws,","){
Kws = strings.Split(kws,",")
}else{
Kws = append(Kws,kws)
}
ck.Kws = Kws
}
return ck
}
type Job struct {
path string
ck *CheckKw
wp *zeronewp.WorkerPool
}
func NewJob(path string,ck *CheckKw,wp *zeronewp.WorkerPool)zeronewp.JobInterface{
return &Job{
path:path,
ck:ck,
wp:wp,
}
}
type FindResult struct{
File string
Status int
Kws string
Msg string
}
func (job *Job)Executed()interface{}{
contents, _ := ioutil.ReadFile(job.path)
str := string(contents)
for _,kw := range job.ck.Kws{
if job.ck.FindType == "1" {
if strings.Contains(str,kw){
fr := &FindResult{
File:job.path,
Status: 1,
Msg:fmt.Sprintf("包含关键字:%s",kw),
}
job.wp.ResultChan <- fr
}
}else{
if strings.Contains(str,kw) && !strings.Contains(str, fmt.Sprintf("z_etl.%s",kw)){
fr := &FindResult{
File:job.path,
Status: 1,
Msg:fmt.Sprintf("包含关键字:%s 不包含z_etl.%s",kw,kw),
}
job.wp.ResultChan <- fr
}
}
}
return nil
}
func (ck *CheckKw)ReadDir(folder string,JobChan chan zeronewp.JobInterface,wp *zeronewp.WorkerPool)error{
if strings.HasSuffix(folder,ck.EndFlag){
JobChan <- NewJob(folder,ck,wp)
}
fs,err := ioutil.ReadDir(folder)
if err != nil{
return err
}
for _,f := range fs{
nextFolder := path.Join(folder,f.Name())
ck.ReadDir(nextFolder,JobChan,wp)
}
return nil
}
func(ck *CheckKw)Run(){
wp := zeronewp.NewWorkerPool(20)
FuncProducerJob := func(JobChan chan zeronewp.JobInterface){
defer func(){
close(JobChan)
}()
ck.ReadDir(ck.Folder,JobChan,wp)
}
wp.Run(FuncProducerJob)
rs := make([]*FindResult,0)
for result := range wp.ResultChan{
if result != nil{
fr := result.(*FindResult)
if fr.Status == 1{
rs = append(rs,fr)
}
}
}
if len(rs)>0{
for len(rs) >0 {
fr := rs[0]
rs = rs[1:]
fmt.Printf("path:%s,%s \n",fr.File,fr.Msg)
}
}else{
fmt.Println("经扫描,该目录下无文件占用查找的关键字")
}
}
func (ck * CheckKw)getKwsByFile(KwFile string){
contents, _ := ioutil.ReadFile(KwFile)
strs := string(contents)
kws := strings.Split(strs,"\n")
for _,k := range kws{
if len(k) > 0{
ck.Kws = append(ck.Kws,k)
}
}
}
文章转载自codefan,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




