2016-02-11 126 views
0

我有一個腳本,我每晚運行一次以獲取存儲在服務器上特定目錄中的東西。這是我使用的是核心部分功能:du命令和Python函數之間的文件大小差異

def get_size(start_path = '.'): 
    total_size = 0 
    for dirpath, dirnames, filenames in os.walk(start_path): 
     for f in filenames: 
      try: 
       fp = os.path.join(dirpath, f) 
       total_size += os.path.getsize(fp) 
       print str(total_size)+" bytes/"+str(size(total_size))+" counted"+" <------------ current position: "+start_path+" : "+f 
       for location in locations_dict: 
        if locations_dict[location][1] != "": 
         print str(location)+": "+str(size(locations_dict[location][1])) 
      except OSError, e: 
       print e 
    return total_size 

出於某種原因,我得到一個不同的值,當我手動運行

$ du -hc [path to dir] 

使用Python,我得到20551043874445個字節(轉換爲20.5 TB)。與du我得到 28 TB(我現在重新運行沒有-h獲得以字節爲單位的值)。

顯然,Python函數缺少一些東西,但我不確定是什麼或如何。有任何想法嗎?

+2

'du'措施對磁盤使用量(因此,向上舍入到文件系統塊大小),而'os.path.getsize()'返回的文件內容字節大小。但是,如果你的目錄包含很多很多的小文件,這隻能解釋這麼大的差別。 –

+0

至少有60,000到100,000個小文件 - 足以說明這一點嗎? – dongle

回答

3

du以512字節塊顯示大小。如果文件大小不是512的倍數,則du向上舍入。要在Python中獲得相同的值,而不是使用os.path.getsize(),請使用os.stat()並使用結果的st_blocks屬性。

total_size += os.stat(fp).st_blocks * 512; 
+0

因此,從某種意義上來說,Python的結果更準確,但是從展示「多少空間正在使用」的角度來看,更準確地說是圓整並表現得像du? – dongle

+0

如果你想知道你有多接近磁盤,你想知道磁盤塊。如果您想知道通過網絡傳輸文件需要多長時間,您需要了解以字節爲單位的大小。 – Barmar

相關問題