为什么计算路径大小的结果与使用du计算相同路径不同

时间:2017-04-28 21:32:45

标签: python linux unix

我制作了一个脚本来计算当前路径的大小。

def getFolderSize(path):
    total_size = os.path.getsize(path)
    for item in os.listdir(path):
        itempath = os.path.join(path, item)
        if os.path.isfile(itempath):
            total_size += os.path.getsize(itempath)
        elif os.path.isdir(itempath):
            total_size += getFolderSize(itempath)
    return total_size

但是,当我运行du时,它会向我显示完全不同的结果。

def du(path):
    return subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')

这两个函数如何不同以及可能导致结果区别的是什么?

1 个答案:

答案 0 :(得分:0)

您的功能不会跳过符号链接。如果链接指向文件,则会添加目标文件的大小。如果链接指向一个目录,它会递归到该目录(如果它指向一个祖先目录,它可能会导致无限递归)。你应该先检查链接。

def getFolderSize(path):
    total_size = os.path.getsize(path)
    for item in os.listdir(path):
        itempath = os.path.join(path, item)
        if os.path.islink(itempath):
            pass
        elif os.path.isfile(itempath):
            total_size += os.path.getsize(itempath)
        elif os.path.isdir(itempath):
            total_size += getFolderSize(itempath)
    return total_size
但是,可能仍然存在一些差异。 du使用磁盘块中的大小,os.path.getsize()返回大小(以字节为单位)。具有大块零字节的文件可能是"稀疏",并且文件系统没有明确地将它们存储在磁盘上,因此它们不会被包含在du输出中。并且du获得了符号链接的大小,但使用os.path方法无法做到这一点(可能还有较低级别的界面)。