利用os模块编写一个能实现dir -l输出的程序
admin
2023-03-12 04:02:09
0

  在Linux下命令ls和dir都有相同的功能:打印当前文件夹目录。

  注:ls 是Linux的原装命令,dir 是原来dos的命令,Linux选择兼容了此个dos命令,所以dir和ls在功能上是一样的。

  1. ls命令

  常见的ls命令有:

  ls # 显示不隐藏的文件与文件夹

  ls -l # 显示不隐藏的文件与文件夹的详细信息

  ls -a # 显示当前目录下的所有文件(包含.开头的隐藏文件)

  注意:total为当前目录下所有文件占用的内存块(block)的大小,即下图第一列数值之和。

  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

  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

  fmt = "%b %d %H:%M"

  self.date = time.strftime(fmt, time.localtime(statinfo.st_mtime))

  self.size = statinfo.st_size

  allocated_size = statinfo.st_blocks * statinfo.st_blksize

  f_bsize = os.statvfs(name).f_bsize

  f_block_num = math.ceil(allocated_size / f_bsize)

  self.fsize = f_block_num * f_bsize // 1024

  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 '-'

  # magic method: Overrides method in object

  def __str__(self):无锡人流医院 http://www.0510bhyy.com/

  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 x in os.listdir('.'):

  if x[0] == '.':

  continue

  item = Info(x)

  width = max(width, len(str(item.size)))

  total += item.fsize

  dir_list.append(x)

  print('total', total)

  for x in sorted(dir_list, key=lambda z: z.upper()):

  print(Info(x, width))


上一篇:脚本实现pv命令

下一篇:Helm安装及配置

相关内容

热门资讯

苏巧慧阵营影射李四川家族涉黑,... 海峡导报综合报道 新北市长选战硝烟渐起,身处苏巧慧阵营的新北市议员翁震州发文质疑李四川家族在小琉球做...
红场阅兵后,普京同军官握手致意 据凤凰卫视报道,5月9日,俄罗斯胜利日阅兵接近尾声,普京与军官一一握手致意。
车间里走出“准工程师”——黄河... 3500元项目津贴,三个真实项目研发经历,一份实习期月薪8000多元的录用通知——这是工学部2022...
狱中一年瘦脱相,被释放的巴勒斯... 曾为巴勒斯坦媒体工作的记者阿里·萨穆迪在以色列监狱被关押一年后,于4月30日获释。获释当天,萨穆迪的...
俄罗斯红场阅兵战士齐呼乌拉 当地时间5月9日10时(北京时间15时),俄罗斯纪念卫国战争胜利81周年阅兵在莫斯科红场举行。俄罗斯...
福建一地发现华南虎?当地辟谣:... 近日,福建龙岩漳平市,有网民称,“三重岭发现华南虎”,还配了一张老虎夜间出没山林的图片。这位网民表示...
俄红场阅兵现场播放无人机作战视... 据凤凰卫视报道,当地时间5月9日,俄罗斯胜利日阅兵式在莫斯科举行。阅兵现场,同步播放了无人机作战相关...
5月10日起,北京部分地铁线试... 为服务骑行爱好者携车出行,在借鉴国内先进城市成熟经验、深入开展实地调研的基础上,结合本市轨道交通运营...
解放军主战舰艇编队进入澎湖西南... 5月9日下午,国防部新闻局副局长、国防部新闻发言人蒋斌大校就近期涉军问题发布消息。媒体提到,据报道,...
普京会见三国总统 强化后苏联空... 普京会见三国总统  【普京会见三国总统】莫斯科5月8日电​ 当地时间5月8日,俄罗斯总统普京在莫斯科...