INIT
This commit is contained in:
5
.gitignore
vendored
Normal file
5
.gitignore
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
archive.zip
|
||||
gofinder.exe
|
||||
result.txt
|
||||
start.bat
|
||||
search.txt
|
||||
4
build linux.bat
Normal file
4
build linux.bat
Normal file
@@ -0,0 +1,4 @@
|
||||
set GOOS=linux
|
||||
set GOARCH=amd64
|
||||
go build -trimpath -ldflags "-s -w"
|
||||
pause
|
||||
2
build win.bat
Normal file
2
build win.bat
Normal file
@@ -0,0 +1,2 @@
|
||||
go build -trimpath -ldflags "-s -w"
|
||||
pause
|
||||
BIN
gofinder.exe
Normal file
BIN
gofinder.exe
Normal file
Binary file not shown.
141
main.go
Normal file
141
main.go
Normal file
@@ -0,0 +1,141 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"archive/zip"
|
||||
"bufio"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var inputDir = flag.String("d", "/", "Dir search")
|
||||
|
||||
func appendLineToFile(filename string, line string) error {
|
||||
file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
_, err = file.WriteString(line + "\n")
|
||||
return err
|
||||
}
|
||||
|
||||
func getAllFiles(root string) ([]string, error) {
|
||||
var files []string
|
||||
|
||||
err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !d.IsDir() {
|
||||
files = append(files, path)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
return files, err
|
||||
}
|
||||
|
||||
func loadStrings() ([]string, error) {
|
||||
log.Println("Loading search.txt")
|
||||
var list []string
|
||||
|
||||
file, err := os.Open("search.txt")
|
||||
if err != nil {
|
||||
return list, err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
list = append(list, strings.TrimSpace(line))
|
||||
log.Println("+", line)
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
return list, err
|
||||
}
|
||||
|
||||
log.Println("Loaded search.txt")
|
||||
return list, nil
|
||||
}
|
||||
|
||||
func checkArchive(zipPath string, list []string) error {
|
||||
r, err := zip.OpenReader(zipPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer r.Close()
|
||||
|
||||
for _, f := range r.File {
|
||||
if strings.Contains(f.Name, ".txt") {
|
||||
rc, err := f.Open()
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
defer rc.Close()
|
||||
|
||||
scanner := bufio.NewScanner(rc)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
for _, str := range list {
|
||||
if strings.Contains(line, str) {
|
||||
log.Println("Found:", line)
|
||||
result := fmt.Sprintf("%s;%s", line, zipPath)
|
||||
appendLineToFile("result.txt", result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err := scanner.Err(); err != nil {
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func threadNew(ch chan string, list []string, wg *sync.WaitGroup) {
|
||||
for zipPath := range ch {
|
||||
log.Println("Check", zipPath)
|
||||
checkArchive(zipPath, list)
|
||||
wg.Done()
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
var wg sync.WaitGroup
|
||||
|
||||
flag.Parse()
|
||||
list, err := loadStrings()
|
||||
if err != nil {
|
||||
log.Fatalf("fail load search list: %v", err)
|
||||
}
|
||||
|
||||
files, err := getAllFiles(*inputDir)
|
||||
if err != nil {
|
||||
log.Fatalf("fail load files list: %v", err)
|
||||
}
|
||||
|
||||
log.Println("Files:", len(files))
|
||||
|
||||
ch := make(chan string)
|
||||
for i := 0; i < 10; i++ {
|
||||
go threadNew(ch, list, &wg)
|
||||
}
|
||||
|
||||
for _, zipPath := range files {
|
||||
wg.Add(1)
|
||||
ch <- zipPath
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
}
|
||||
0
result.txt
Normal file
0
result.txt
Normal file
Reference in New Issue
Block a user