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等)、Hadoop\Spark分布式框架。
薪資待遇:薪資面議,只要你足夠優秀,我們願意提供相應的薪資,公司各項福利優厚,工作環境寬松,不強制996,個人愛好和興趣驅動。
聯系方式:可以直接通過博客園聯系,或Email:shoufengwei@phitrellis.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM