我正在创build一个实用程序,它将遍历目录并获取所有目录的子目录和文件的大小并存储值。 但是,大小不正确计算。
这是我的课程,通过所有的子目录自动recursion:
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)
我有一个video目录,我正在testing这个程序:
a =目录('/ var / media / television / The Wire')
- 如果一个命令行程序不确定stdout的编码,它应该输出什么编码?
- 如何检测Linux板上GPIO引脚的变化
- 在两个string之间重复提取文本? (awk?sed?)
- 如何在bash中sorting多行?
- scp一个文件夹到远程系统保持目录布局
a.size
45289964053
但是,当我尝试杜,我得到
〜#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向下舍去。
du
在默认情况下在磁盘上给出了大小,而在st_size
给出了实际的文件大小。
$ du test.txt 8 test.txt $ du -b test.txt 6095 test.txt >>> os.stat('test.txt').st_size 6095
我会写这个代码为:
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)
在Linux上(我正在使用CentOS),'du -b'将以字节为单位返回,并将激活–apparent-size,从而返回文件的大小,而不是磁盘空间的大小。 试试看看是否与Python os.stat
所说的一致。