2016-02-11 4 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 ТБ). С du я получаю 28 ТБ (я возвращаюсь теперь без -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