gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:11 24 4
gpt4 key购买 nike

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

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')

这两个函数有何不同,是什么导致了结果的不同?

最佳答案

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

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 使用磁盘 block 大小,os.path.getsize() 返回字节大小。具有大块零字节的文件可能是“稀疏的”,并且文件系统不会将它们显式存储在磁盘上,因此它们不会包含在 du 输出中。 du 获取符号链接(symbolic link)的大小,但是使用 os.path 方法无法做到这一点(也许有一个较低级别的接口(interface))。

关于python - 为什么计算路径大小的结果与使用 du 计算相同路径的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com