commit 77029537b73aca2764d5cea661db5f6116665a9c Author: Lizard Date: Fri Dec 26 18:15:15 2025 +0300 INIT diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..930b2a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +archive.zip +gofinder.exe +result.txt +start.bat +search.txt \ No newline at end of file diff --git a/build linux.bat b/build linux.bat new file mode 100644 index 0000000..30d3329 --- /dev/null +++ b/build linux.bat @@ -0,0 +1,4 @@ +set GOOS=linux +set GOARCH=amd64 +go build -trimpath -ldflags "-s -w" +pause \ No newline at end of file diff --git a/build win.bat b/build win.bat new file mode 100644 index 0000000..4b01a80 --- /dev/null +++ b/build win.bat @@ -0,0 +1,2 @@ +go build -trimpath -ldflags "-s -w" +pause \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..9cbcefc --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gofinder + +go 1.25.4 diff --git a/gofinder.exe b/gofinder.exe new file mode 100644 index 0000000..c8ced27 Binary files /dev/null and b/gofinder.exe differ diff --git a/main.go b/main.go new file mode 100644 index 0000000..15a23c2 --- /dev/null +++ b/main.go @@ -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() +} diff --git a/result.txt b/result.txt new file mode 100644 index 0000000..e69de29