package file import ( "bufio" "fmt" "io/fs" "os" "os/exec" "time" "github.com/spf13/afero" ) type FileOption struct { Path string `json:"path"` Search string `json:"search"` ContainSub bool `json:"containSub"` Expand bool `json:"expand"` Dir bool `json:"dir"` ShowHidden bool `json:"showHidden"` Page int `json:"page"` PageSize int `json:"pageSize"` } type FileInfo struct { Fs afero.Fs `json:"-"` Path string `json:"path"` Name string `json:"name"` Extension string `json:"extension"` Content string `json:"content"` Size int64 `json:"size"` IsDir bool `json:"isDir"` IsSymlink bool `json:"isSymlink"` IsHidden bool `json:"isHidden"` LinkPath string `json:"linkPath"` Type string `json:"type"` Mode string `json:"mode"` MimeType string `json:"mimeType"` UpdateTime time.Time `json:"updateTime"` ModTime time.Time `json:"modTime"` FileMode os.FileMode `json:"-"` Items []*FileInfo `json:"items"` ItemTotal int `json:"itemTotal"` } func (f *FileInfo) search(search string, count int) (files []FileSearchInfo, total int, err error) { cmd := exec.Command("find", f.Path, "-name", fmt.Sprintf("*%s*", search)) output, err := cmd.StdoutPipe() if err != nil { return } if err = cmd.Start(); err != nil { return } defer func() { _ = cmd.Wait() _ = cmd.Process.Kill() }() scanner := bufio.NewScanner(output) for scanner.Scan() { line := scanner.Text() info, err := os.Stat(line) if err != nil { continue } total++ if total > count { continue } files = append(files, FileSearchInfo{ Path: line, FileInfo: info, }) } if err = scanner.Err(); err != nil { return } return } type FileSearchInfo struct { Path string `json:"path"` fs.FileInfo }