This commit is contained in:
Lizard
2025-12-26 18:15:15 +03:00
commit 77029537b7
7 changed files with 155 additions and 0 deletions

141
main.go Normal file
View 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()
}