gpt4 book ai didi

Python:os.stat().st_size 给出的值与 du 不同

转载 作者:IT王子 更新时间:2023-10-29 00:25:59 25 4
gpt4 key购买 nike

我正在创建一个实用程序,它将遍历目录并获取所有目录的子目录和文件的大小并存储该值。但是,尺寸计算不正确。

这是我的类,它自动递归遍历所有子目录:

class directory:
'''
Class that automatically traverses directories
and builds a tree with size info
'''
def __init__(self, path, parent=None):

if path[-1] != '/':
# Add trailing /
self.path = path + '/'
else:
self.path = path
self.size = 4096
self.parent = parent
self.children = []
self.errors = []
for i in os.listdir(self.path):
try:
self.size += os.lstat(self.path + i).st_size
if os.path.isdir(self.path + i) and not os.path.islink(self.path + i):
a = directory(self.path + i, self)
self.size += a.size
self.children.append(a)
except OSError:
self.errors.append(path + i)

我有一个视频目录,我正在用它来测试这个程序:

>>> a = directory('/var/media/television/The Wire')
>>> a.size
45289964053

但是,当我尝试使用 du 时,我得到了

$ du -sx /var/media/television/The\ Wire
44228824

目录不包含任何链接或任何特殊内容。

有人可以解释为什么 os.stat() 给出奇怪的大小读数吗?

平台:

  • Linux (Fedora 13)
  • python 2.7

最佳答案

考虑这个文件 foo

-rw-rw-r-- 1 unutbu unutbu 25334 2010-10-31 12:55 foo

它由 25334 字节组成。

tune2fs 告诉我 foo 驻留在 block 大小为 4096 字节的文件系统上:

% sudo tune2fs -l /dev/mapper/vg1-OS1
...
Block size: 4096
...

因此,文件系统上最小的文件将占用 4096 字节,即使其内容仅包含 1 个字节。随着文件变大,空间以 4096 字节 block 的形式分配。

杜报告

% du -B1 foo
28672 foo

注意 28672/4096 = 7。这表示 foo 在文件系统上占用 7 个 4096 字节的 block 。这是容纳 25334 字节所需的最小块数。

% du foo
28 foo

此版本的 du 仅报告 28672/1024 四舍五入。

关于Python:os.stat().st_size 给出的值与 du 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4080254/

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