• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

在Linux上实现自定义的-ls命令

linux 搞代码 3年前 (2022-03-03) 18次浏览 已收录 0个评论
  1. 浏览联机帮助

列出无关文件的信息(默认为当前目录)。如果未指定 -cftuvSUX 或 –sort,则按字母程序对条目进行排序。

能够看到,ls命令 可能找出当前目录中所有文件的文件名,按字典序排序后输入。

ls命令 还能显示其余信息,如果加上 -l 选项,ls 会列出每个文件的详细信息,也叫 ls的长格局,在 man手册 中能够看到:

应用长列表格局

当初在咱们的终端键入命令:

通过试验和联机帮助能够晓得 ls 做了以下两件事(ls 能断定参数指定的是文件还是目录):

列出目录的内容
显示文件的信息
在正式开始之前,来看一下 Unix 是如何组织磁盘上的文件的。

大方框示意目录,大方框内的小方框示意文件,目录之间的连线示意目录之间的组织关系。
https://www.doc88.com/p-38773…

  1. ls是如何工作的
    通过联机帮助(过程省略)能够晓得,从目录读数据与从文件读数据是相似的, opendir 关上一个目录,readdir 返回目录中的以后项,closedir 敞开一个目录,seekdir、telldir、rewinddir与 lseek 的性能相似。

接下来用 man手册 查问一下 readdir(3) ,能够看到:

readdir() 函数返回一个指向 dirent 构造的指针,该构造示意 dirp 指向的目录流中的下一个目录条目。它在达到目录流开端或产生谬误时返回 NULL。

也就是说, readdir() 来读取 struct dirent取得目录中的记录。

  1. 如何编写ls
    最高级的ls命令

上面实现了一个最高级的 ls命令

include <stdio.h>

include <sys/types.h>

include <dirent.h> // opendir() readdir() closedir()

https://www.doc88.com/p-38773&#8230;
void do_ls(char*);

int main(int argc, char* argv[]) {

if (argc == 1) {
    do_ls(".");
}
else {
    while (--argc) {
        printf("%s:\n", *(++argv));
        do_ls(*argv);
    }
}

return 0;

}

void do_ls(char dirname[]) {

DIR* dir_ptr;       // 记录opendir()后的返回值
struct dirent* direntp; // 记录readdir()后的返回值

if ((dir_ptr = opendir(dirname)) == NULL) {
    fprintf(stderr, "ls1: cannot open %s\n", dirname);
}
else {
    while ((direntp = readdir(dir_ptr)) != NULL) {
        printf("%s\n", direntp->d_name);
    }
    closedir(dir_ptr);
}

https://www.doc88.com/p-38773&#8230;
运行后果:

  1. 改良ls命令
    退出以下性能:

    排序
    解决办法:把所有的文件名读入一个数组,用qsort函数排序

分栏:规范的 ls 输入是分栏排列的,有些以行排列,有些以列排列
解决办法:把文件名读入数组,而后计算入列的宽度和行数

“.”文件:ls 列出了 “.”文件,而规范的 ls只有在给出 -a 选项时才会列出
解决办法:使 ls1 可能接管选项 -a,并在没有 -a 的时候不显示暗藏文件

选项 -l:如果选项中有 -l,规范的 ls会列出文件的详细信息,而 ls1不会
解决办法: 上面探讨


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:在Linux上实现自定义的-ls命令

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址