我制作了一个脚本来计算当前路径的大小。
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')
这两个函数如何不同以及可能导致结果区别的是什么?
答案 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
方法无法做到这一点(可能还有较低级别的界面)。