我正在创建一个实用程序,它将遍历目录并获取所有目录的子目录和文件的大小并存储该值。但是,尺寸计算不正确。
这是我的类,它会自动递归所有子目录:
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()
会给出奇怪的尺寸读数吗?
平台:
答案 0 :(得分:9)
考虑这个文件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 reports
% du -B1 foo
28672 foo
注意28672/4096 = 7.这就是说foo在文件系统上占用了7个4096字节的块。这是保存25334字节所需的最小块数。
% du foo
28 foo
此版本的du
仅向下报告28672/1024。
答案 1 :(得分:1)
du
默认提供磁盘大小,而不是st_size
中给出的实际文件大小。
$ du test.txt
8 test.txt
$ du -b test.txt
6095 test.txt
>>> os.stat('test.txt').st_size
6095
答案 2 :(得分:0)
在linux上(我使用的是CentOS),'du -b'将以字节返回并激活--apparent-size ,从而返回文件的大小而不是磁盘空间量它正在使用。试试看,看看它是否与Python os.stat
所说的一致。
答案 3 :(得分:0)
我会将此代码编写为:
import os, os.path
def size_dir(d):
file_walker = (
os.path.join(root, f)
for root, _, files in os.walk(d)
for f in files
)
return sum(os.path.getsize(f) for f in file_walker)
如果您想将目录计为4k,那么请执行以下操作:
import os, os.path
def size_dir(d):
file_walker = (
os.path.join(root, f)
for root, _, files in os.walk(d)
for f in files
)
dir_walker = (
4096
for root, dirs, _ in os.walk(d)
for d in dirs
)
return 4096 + sum(os.path.getsize(f) for f in file_walker) + sum(size for size in dir_walker)