利用os模块编写一个能实现dir -l输出的程序

在Linux下命令ls和dir都有相同的功能:打印当前文件夹目录。
注:ls 是Linux的原装命令,dir 是原来dos的命令,Linux选择兼容了此个dos命令,所以dir和ls在功能上是一样的。

1. ls命令

常见的ls命令有:
ls       # 显示不隐藏的文件与文件夹
ls -l   # 显示不隐藏的文件与文件夹的详细信息
ls -a   # 显示当前目录下的所有文件(包含.开头的隐藏文件)
在这里插入图片描述
注意:total为当前目录下所有文件占用的内存块(blocks)的大小,即下图第一列数值之和。
在这里插入图片描述

2. Python实现dir -l 命令

对于利用os模块编写一个能实现dir -l输出的程序,首先得了解一下各个字段的含义,请参考:
https://baike.baidu.com/item/ls%20-l/5261110?fr=aladdin
显然难点在于怎样获取文件权限、文件大小、文件创建时间。

import os
import time
import stat
import math
from pwd import getpwuid
from grp import getgrgid

# 权限:-代表无权限;r代表具有可读权限; w代表具有可写权限;x代表具有可执行权限
FILE_PERMS = [
    # 代表拥有者权限
    {'r': stat.S_IRUSR, 'w': stat.S_IWUSR, 'x': stat.S_IXUSR},
    # 代表同组权限
    {'r': stat.S_IRGRP, 'w': stat.S_IWGRP, 'x': stat.S_IXGRP},
    # 代表其他组权限
    {'r': stat.S_IROTH, 'w': stat.S_IWOTH, 'x': stat.S_IXOTH}
]


class Info:
    def __init__(self, name, size_width=0):
        self.width = size_width
        # 返回文件的系统状态信息
        statinfo = os.stat(name)
        mode = statinfo.st_mode
        self.name = name
        # 文件最后修改时间
        self.date = time.strftime("%b %d %H:%M", time.localtime(statinfo.st_mtime))

        # 文件实际的大小,以字节为单位
        self.size = statinfo.st_size

        # 文件系统块的大小
        f_bsize = os.statvfs(name).f_bsize
        # 块没用完也不能分配给其他文件
        f_block_num = math.ceil(self.size / f_bsize)
        self.fsize = f_block_num * 4

        self.user = getpwuid(statinfo.st_uid).pw_name
        self.group = getgrgid(statinfo.st_gid).gr_name
        self.nlink = statinfo.st_nlink
        self.perm = 'd' if stat.S_ISDIR(mode) else '-'
        for perm in FILE_PERMS:
            self.perm += 'r' if mode & perm['r'] else '-'
            self.perm += 'w' if mode & perm['w'] else '-'
            self.perm += 'x' if mode & perm['x'] else '-'

    # 魔法方法: 重写了源码中的方法
    def __str__(self):
        return "{} {} {} {} {:{width}} {} {}".format(
            self.perm, self.nlink, self.user, self.group,
            self.size, self.date, self.name, width=self.width)


if __name__ == '__main__':
    total = 0
    dir_list = []
    width = 0
    for name in os.listdir('.'):
        if name[0] == '.':
            continue
        item = Info(name)
        width = max(width, len(str(item.size)))
        total += item.fsize
        dir_list.append(name)

    print('total', total)
    for x in sorted(dir_list, key=lambda z: z.upper()):
        print(Info(x, width))

注意:块大小是文件系统在给文件分配空间时的最小单位。文件系统并不是以字节为单位给具体文件分配空间,而是以为单位进行分配,因此有可能一个块没用完也不能再分配给其他文件。
在这里插入图片描述在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值