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

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

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 驻留在块大小为 4096 字节的文件系统上:
    % sudo tune2fs -l /dev/mapper/vg1-OS1
    ...
    Block size:               4096
    ...
    

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

    杜报告
    % du -B1 foo
    28672   foo
    

    请注意,28672/4096 = 7。这就是说 foo 在文件系统上占用了 7 个 4096 字节的块。这是容纳 25334 字节所需的最小块数。
    % du foo
    28  foo
    

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

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

    10-11 22:07