如何通过命令行查看目录下上千个文件?

我已将超过 500 GB 的数据下载到 AWS 的单个目录中。每当我尝试访问该目录时,命令行都会挂起并且不向我显示任何内容。


我正在尝试运行一些代码,通过打印出每个文件的路径来与文件交互,但命令行挂起,然后退出程序。


该程序肯定会开始执行,因为“打印文件路径”显示在控制台上。


func main() {

    fmt.Println("Printing file path's")


    err := filepath.Walk(source,

        func(fpath string, info os.FileInfo, err error) {

            if !info.IsDir() && file path.Ext(fpath)==".txt" {

                fmt.Println(fpath)

            }

         }

    }

}

我应该如何处理能够在命令行中查看所有文件的情况以及为什么该程序无法运行?


更新:通过使用


files, err := dir.Readdir(10)

        if err == io.EOF {

            break

        }

我能够抢占目录中的前 10 个文件夹/文件。使用循环,我可以继续执行此操作,直到到达目录末尾。


这不像 walk 功能那样依赖于对文件/文件夹进行排序,因此效率更高。


收到一只叮咚
浏览 93回答 1
1回答

慕无忌1623718

filepath.Walk 可能存在的性能问题有明确记录:文件按词法顺序遍历,这使得输出具有确定性,但意味着对于非常大的目录,遍历可能效率低下。使用os.File.Readdir按文件系统顺序迭代文件:Readdir 读取与文件关联的目录的内容,并返回最多包含 n 个 FileInfo 值的片段,如 Lstat 按目录顺序返回的那样。对同一文件的后续调用将产生更多的 FileInfo。package mainimport (    "fmt"    "io"    "log"    "os"    "time")func main() {    dir, err := os.Open("/tmp")    if err != nil {        log.Fatal(err)    }    for {        files, err := dir.Readdir(10)        if err == io.EOF {            break        }        if err != nil {            log.Fatal(err)        }        for _, fi := range files {            classifier := ""            if fi.IsDir() {                classifier = "/"            }            fmt.Printf("%v %12d %s%s\n",                fi.ModTime().UTC().Truncate(time.Second),                fi.Size(),                fi.Name(), classifier,            )        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go