Linux 下简单 ls 命令的实现

功能

该程序的功能包括:

  • 列出指定目录下的所有文件和子目录
  • 对列表进行排序,支持按照时间、名称等进行排序
  • 支持展示文件的名称、大小、权限、修改时间等元信息
  • 支持展示文件inode号和文件占用块数量(单位为4KB)
  • 该程序还支持的参数有:
    • -a:列出所有文件和子目录,包括隐藏文件和文件夹
    • -l:展示详细的文件元信息,包括文件权限、大小、修改时间、占用块数量、链接数等
    • -R:递归展示子目录下的文件信息
    • -t:按照时间进行排序
    • -r:逆序排序
    • -i:展示文件的inode号
    • -s:展示文件的占用块数量(单位为512字节)

使用该程序,只需要在终端中输入 ./zls 命令即可,默认情况下,它会展示当前所在目录下的所有文件和目录。如果想要指定一个目录进行展示,可以在命令中输入要展示的目录名。

函数

list 函数

list() 是最核心的函数,负责展示指定目录下的文件列表信息。该函数主要的实现逻辑包括:

  • 首先打开指定目录,并读取目录下的所有文件和子目录
  • 对读取到的文件和子目录进行排序
  • 针对每一个文件和目录,展示它们的信息
  • 在实现过程中,需要注意:如果该目录无法打开,说明该目录可能不存在或者无权访问,此时需要检查该路径是否为一个文件,如果是,则展示该文件的信息。

此外,如果参数中包含 -R 参数,则需要递归展示子目录下的文件列表。具体实现时,可以在每次读取到一个子目录时,调用 list 函数进行递归展示。

listfile 函数

listfile()list() 中最核心的输出函数。该函数用于展示文件的信息,包括名称、大小、权限、修改时间等。使用 ANSI 控制字符可以实现对输出文本颜色的改变。

在实现过程中,需要注意:如果参数中包含 -l 参数,则需要展示详细的文件元信息。此时,需要通过调用 mod2str() 函数将文件权限码转化为字符串,并通过 uname()gname() 将用户id和组id转化为用户名和组名。

parseParam 函数

parseParam() 函数负责解析命令行参数,并设置对应的展示 flag,以便在展示文件列表时能够根据 flag 进行展示。其核心实现逻辑为:针对每一个传入参数,检查其首字符是否为 -,如果是则解析其中包含的flag。

在实现过程中,这里使用了一个宏定义,用于简化代码。不同的参数对应不同的 flag,因此这里使用了二进制位运算,每个 flag 对应一个二进制位,当设置 flag 后把对应二进制位置为 1。使用位运算可以将多个 flag 组合在一起传入。

mod2str 函数

mod2str() 用于将文件权限码转化为字符串。权限编码由三个八进制数字组成,每个数字对应一个权限,分别为所有者、同组用户、其他用户。具体实现时,可以通过判断文件类型和各个权限位来将它们转化为字符串。返回的字符串长度为 10

num2str 函数

num2str() 函数用于将数字转化为字符串。该函数中使用了 sprintf() 对数字进行了格式化处理,可将其转化为对应的字符串。返回的字符串长度不定,根据传入的数字而定。

uname 函数和 gname 函数

uname()gname() 分别用于将用户id和组id转化为用户名和组名。这里使用了 getpwuid()getgrgid() 获取对应的用户信息和组信息,如果获取不到则返回该 id 的字符串形式。

ls 的功能基本实现,并支持了一些扩展性比较好的参数,可以通过该程序快速方便地展示文件列表信息。

VS Code 简单配置项

Linux QQ 崩溃解决办法

评论区

评论加载中...