2009-02-22 21 views
5

我一直在試圖弄清楚如何檢索(快速)與python給定的HFS +驅動器上的文件數量。如何用Python確定驅動器上的文件數量?

我一直在玩os.statvfs等,但不能完全得到任何東西(這似乎對我有幫助)。

任何想法?

編輯:讓我更具體一點。 =]

由於各種原因我正在寫一個圍繞rsync的類似於時間機器的包裝,並且希望rsync驅動器要掃描的驅動器上的文件數量非常快(不一定非常完美)。通過這種方式,我可以觀看rsync的進度(如果您將它稱爲rsync -ax --progress-P選項),因爲它會構建其初始文件列表,並向用戶報告百分比和/或ETA。

這與實際的備份完全分開,跟蹤進度沒有問題。但對於我正在處理的數百萬個文件的驅動器,這意味着用戶正在觀看文件數量的計數器上升幾分鐘。

我已經嘗試玩os.statvfs完全到目前爲止的答案中描述的方法,但結果對我來說沒有意義。

>>> import os 
>>> os.statvfs('/').f_files - os.statvfs('/').f_ffree 
64171205L 

更便攜的方式給我約110萬這臺機器,這是一樣的所有其他指標我已經看到了這臺機器上,包括rsync的運行它的籌備工作:

>>> sum(len(filenames) for path, dirnames, filenames in os.walk("/")) 
1084224 

注意第一種方法是即時的,而第二種方法讓我在15分鐘後回來更新,因爲它需要很長時間才能運行。

有誰知道類似的方法來獲得這個數字,或者我怎麼對待/解釋os.statvfs數字有什麼問題?

+0

os.statvfs [os.B_FILES]的輸出如何與您期望的不同? (如果你可以粘貼來自os.statvfs的示例輸出,並解釋*爲什麼*這沒有幫助,那可以幫助那些不瞭解OS X的人幫助你)。 – 2009-02-22 03:54:25

+0

@Charles:我已經用一些實際的細節更新了我的問題... – 2009-02-24 17:08:29

+0

您可以使用之前rsync運行中的一個數字。它快速,便攜,並且對於10 ** 6個文件和任何合理的備份策略,它會給你1%或更高的精度。 – jfs 2009-02-24 18:25:49

回答

2

你可以使用一個號碼從以前rsync運行。它是快速,便攜,併爲10**6文件和任何合理的備份策略,它會給你1%或更好的精度。

7

您的目的的正確答案是沒有進度條一次存儲,存儲的數字rsync出現並假定您有與上次每次連續備份相同數量的文件。

我不相信它,但是這似乎是工作在Linux上:

os.statvfs('/').f_files - os.statvfs('/').f_ffree 

此計算文件塊減去免費文件塊的總數。它似乎顯示整個文件系統的結果,即使您將它指向另一個目錄。 os.statvfs僅在Unix上實現。

好吧,我承認,我並沒有真正讓「緩慢,正確」的方式完成,驚歎於快速的方法。只有幾個缺點:我懷疑.f_files也會計算目錄,結果可能是完全錯誤的。它可能會以慢速方式對文件進行計數,然後從「快速」方式調整結果?

便攜式方式:

import os 
files = sum(len(filenames) for path, dirnames, filenames in os.walk("/")) 

os.walk返回文件系統中的每個目錄開始於給定路徑的3元組(dirpath,dirnames中,文件名)。對於"/"這可能需要很長時間,但您已經知道了。

最簡單的辦法:

讓我們面對它,沒有人知道或關心他們有多少個文件真的有,這是一個單調和多少價值統計數字。您可以使用此代碼將這個很酷的「文件數量」功能添加到您的程序中:

import random 
num_files = random.randint(69000, 4000000) 

讓我們知道這些方法是否適用於您。

參見How do I prevent Python's os.walk from walking across mount points?

0

編輯:Spotlight不會跟蹤每一個文件,因此它的元數據是不夠的。

1

如果遍歷目錄樹是一種選擇(會比直接查詢驅動慢):

import os 

dirs = 0 
files = 0 

for r, d, f in os.walk('/path/to/drive'): 
    dirs += len(d) 
    files += len(f) 
相關問題