为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
收到一只叮咚 2023-07-10 14:31:11
我已将超过 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 功能那样依赖于对文件/文件夹进行排序,因此效率更高。
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

filepath.Walk 可能存在的性能问题有明确记录:

文件按词法顺序遍历,这使得输出具有确定性,但意味着对于非常大的目录,遍历可能效率低下。

使用os.File.Readdir按文件系统顺序迭代文件:

Readdir 读取与文件关联的目录的内容,并返回最多包含 n 个 FileInfo 值的片段,如 Lstat 按目录顺序返回的那样。对同一文件的后续调用将产生更多的 FileInfo。

package main


import (

    "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,

            )

        }

    }

}


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信