实现代码如下:

说明:现在代码已实现du命令的 -s 统计功能,统计与系统du命令稍有差别,比如用ls -ld /root结果为4096,而du计算出来是1040,用当前python计算出来也是4096。

#!/usr/bin/python#*-*coding:utf8*-*import sysimport osfrom optparse import OptionParser#使用选项帮助信息可以使用中文reload(sys)sys.setdefaultencoding("utf-8")#定义选项和帮助信息usage = sys.argv[0] + " [选项]... [对象]..."parser = OptionParser(usage)parser.add_option("-s",                   dest="sum",                  action="store_true",                  default=False,                  help="统计指定对象的的大小总和")parser.add_option("-a",                  dest="autoDisplay",                  action="store_true",                  default=False,                  help="根据大小自动显示 k,KB,MB,GB 等单位")options, args = parser.parse_args()#判断文件或目录是否存在def noFile(i):    if not os.path.exists(i):        sys.stderr.write(i + "\tis not exists\n")        exit(1)#定义显示样式def autoDisplay(num):    float(num)    if num < 1024:        return str(num) + "B"    elif num < 1024*1024:        return str("%.1f" %(num/1024)) + "K"    elif num < 1024*1024*1024:        return str("%.1f" %(num/1024/1024)) + "M"    else:        return str("%.2f" %(num/1024/1024/1024)) + "G"sum = 0for i in args:    noFile(i)    if os.path.isfile(i):        size = os.path.getsize(i)        sum += size        print("%s\t%s" %(autoDisplay(sum), i))    if os.path.isdir(i):        dir = os.walk(i)        for x, y, z in dir:            size = os.path.getsize(x)    #对目录本身进行大小统计,和du统计结果有点不太一样            sum += size            if options.sum:                pass            else:                if options.autoDisplay:                    print("%s\t%s" %(autoDisplay(size), x))                else:                    print("%d\t%s" %(size, x))            for f in z:                size = os.path.getsize(os.path.join(x, f))    #对目录里面文件进行大小统计                sum += size                if options.sum:                    pass                else:                    if options.autoDisplay:                        print("%s\t%s" %(autoDisplay(size), os.path.join(x, f)))                    else:                        print("%d\t%s" %(size, os.path.join(x, f)))        """如果加上-s选项,这里就输入总的大小"""        if options.sum:                    print("%s\t%s" %(autoDisplay(sum), i))

程序执行结果如下: