du 命令和 Python 函数之间的文件大小差异

File size discrepancy between du command and Python function

我有一个脚本,我每晚 运行 获取存储在我服务器上特定目录中的大量内容。这是我在该核心部分使用的功能:

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 函数缺少某些东西,但我不确定是什么或如何。有什么想法吗?

du 以 512 字节块显示大小。如果文件大小不是 512 的倍数,则 du 向上舍入。要在 Python 中获取等效值,而不是使用 os.path.getsize(),请使用 os.stat() 并使用结果的 st_blocks 属性。

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