登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-20 10:00:34 284浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《如何通过命令行查看目录下上千个文件?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我已将超过 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 功能那样依赖于对文件/文件夹进行排序,因此效率更高。


解决方案


filepath.walk is clearly documented 可能出现的性能问题:

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

使用 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,
            )
        }
    }
}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>