• linux下快速列出文件列表的方法


    前言

    这两天碰到一个很棘手的问题,需要读取出ubuntu系统中某个目录下所有文件,由于服务器中存储的文件实在太多,导致此过程效率十分低下,动辄需要等待一个小时之久,还只是一个目录。于是如何快速获取文件列表便是这两天的头等大事,折腾半天找到一个较为快速的方法,记录如下。

    多种实现方法

    尝试了多种方法,有编程的和非编程的。

    walk

    python的walk库能够递归的读取目录下所有文件,这个是最常规的方法,然而效率有些缓慢。实现很简单,不赘述。

    os.scandir

    python中的os.scandir方法官方解释为快速读取目录,测试了一下速度相对walk而言是由提高,但是还是达不到要求,也需要自己写递归,代码如下:

    def scan_path(file_path, level = 3):
        files = []
        if level >= 0:
            path = os.scandir(file_path)
            for p in path:
                if p.is_dir():
                    files.extend(scan_path(p.path, level - 1))
                else:
                    files.append(p.path)
        return files
    

    当这两种方法都行不通的时候我就开始考虑才用非编程方法了。理论上来说python的执行效率已经蛮高了,虽然可能达不到c或者c++的速度,但是相比java、C#来说已经够快了,所以就没有再考虑编程的方式,而是转向linux系统原生的方式。

    ls

    最先想到的就是ls命令,使用如下命令

    ls –l –R(或-lR) src > list.txt
    

    此命令能够列出src目录下的所有文件,但是效率还是不够高,而且结果包含了目录信息以及文件信息,不太整齐,需要后续处理。

    tree

    tree命令本身用于列出文件系统的结构树,在设置一些参数的情况下也能够实现列出所有目录和文件的功能。

    tree -afi -L 3 -o 2.txt --noreport src
    

    -a列出所有文件,-f列出完整路径(结果为绝对路径或者相对路径与find用法一致),-i不画tree的结构线, -L列出多少层目录,-o输出到文件,--noreport不要最后的summary。

    find

    find命令本身是查找文件的命令,但是如果使用得当,能够快速列出目录下文件,命令如下:

    find src > 1.txt
    

    此命令速度足够快,基本能够满足需要了。find的结果相对当前src的路径,也就是说其每条结果的开头均是src,如果src为绝对路径,则结果为绝对路径,如果src为相对路径,则结果以此相对路径为开头。

    locate

    又Google了一下,发现locate与find的功能相似,locate也能够查找文件,于是猜想locate也能够实现此功能,试之,果然可以,写法都是一样的。

    locate src > 1.txt
    

    不同点在于无论src为相对路径还是绝对路径,其结果均为绝对路径。

    使用time命令进行命令执行时间测试,发现find和locate时间基本相同,有时locate会稍微快一些,而tree命令则有些慢。

    结论

    以上均可取到文件夹下所有文件,使用walk和scandir最为方便与程序集成,但是速度稍微有些慢,find和locate命令速度较快,tree命令功能强大,但速度相对find和locate有些慢,此三者若要与python集成,则需要在程序中使用os.popen等管道机制来执行拼接的bash命令。所以以上命令各有所长,按照自己的需求取舍。


    打个广告,年初我与朋友成立了一家公司,现长期招聘,如下:

    公司名称:武汉一格空间科技有限公司
    官网主页:http://www.phitrellis.com
    公司简介:我们是一家初创公司,专注于地理信息系统,目前方向为研发一套地信大数据管理、可视化、分析平台
    工作地址:甘肃兰州
    招聘岗位:前端、后端均可
    职位要求:没有特殊要求,只要你有能力,有拼搏进取的精神,能吃苦、肯学、肯上进,愿意与公司共同成长,我们都很欢迎
    技术框架:前端主要用到React,后端主要用到Python、Scala,包含数据处理(numpy、pandas)、地信基础分析(geopandas、rasterio等)、HadoopSpark分布式框架。
    薪资待遇:薪资面议,只要你足够优秀,我们愿意提供相应的薪资,公司各项福利优厚,工作环境宽松,不强制996,个人爱好和兴趣驱动。
    联系方式:可以直接通过博客园联系,或Email:shoufengwei@phitrellis.com

  • 相关阅读:
    JSP(工作原理,组成部分,指令标签,动作标签,隐式对象)
    会话技术cookie与session
    上下文对象-请求对象-响应对象(ServletContext
    反射
    Servlet
    Tomcat服务器
    Http协议
    客户端与服务器
    Oracle虚拟机 与 windows配置
    SQL语句简单整理
  • 原文地址:https://www.cnblogs.com/shoufengwei/p/7643415.html
Copyright © 2020-2023  润新知