以递归方式查找目录中的文件

Net*_*ire 2 recursion search file go

我想以递归方式查找与目录中特定模式匹配的所有文件(包括子目录).我写了代码来做到这一点:

libRegEx, e := regexp.Compile("^.+\\.(dylib)$")
if e != nil {
    log.Fatal(e)
}

files, err := ioutil.ReadDir("/usr/lib")
if err != nil {
    log.Fatal(err)
}

for _, f := range files {
    if libRegEx.MatchString(f.Name()) {
        println(f.Name())
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它只搜索/usr/bin,但我也想在其子目录中搜索匹配项.我怎样才能做到这一点?谢谢.

Adr*_*ian 8

标准库的filepathWalk正是出于这个目的:"遍历以root为根的文件树,为树中的每个文件或目录调用walkFn,包括root." 例如:

libRegEx, e := regexp.Compile("^.+\\.(dylib)$")
if e != nil {
    log.Fatal(e)
}

e = filepath.Walk("/usr/lib", func(path string, info os.FileInfo, err error) error {
    if err == nil && libRegEx.MatchString(info.Name()) {
        println(f.Name())
    }
    return nil
})
if e != nil {
    log.Fatal(e)
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该更新答案以使用 Go 1.16 中提供的更高效的 filepath.WalkDir 函数。 (7认同)

小智 8

从 Go 1.16(2021 年 2 月)开始,您可以使用filepath.WalkDir

package main

import (
   "io/fs"
   "path/filepath"
)

func walk(s string, d fs.DirEntry, e error) error {
   if e != nil { return e }
   if ! d.IsDir() {
      println(s)
   }
   return nil
}

func main() {
   filepath.WalkDir("..", walk)
}
Run Code Online (Sandbox Code Playgroud)

https://golang.org/pkg/path/filepath#WalkDir