ls

判断是否有路径参数

optind初值为1,读取一个选项+1(包括选项所带的参数和错误的选项).每个选项字符后可以跟一个冒号字符(:),表示这个选项带有一个参数。

函数返回读取的选项,错误返回(?),optind存储每次读取的选项(包括错误的)。

检测到一个选项就把该选项的值(全局变量)变为1。

选项-l

​ 把readdir()的返回值作为参数传给ls_l(),调用stat()。



​ 把stat结构体中的st_mode和以上常量相与(&),输出文件的类型和权限位。


​ 把stat结构体中的st_uid传入getpwuid()获取输出struct passwd中的pw_name。同理也可获得组名。

​ 其余信息也都在stat结构体中,时间用ctime()按格式输出

选项-r

在函数内重新调用函数进行递归,即可倒序输出。

选项-i

调用stat(),输出struct stat 中的 st_ino。

选项-s

调用stat(),输出struct stat 中的 st_blocks。

(我的是512字节一块所以输出时除2)

选项-R

遍历完一个目录后,后用rewinddir()再遍历一次如果文件名是“.”或"…“时continue。其他的用stat()获得的st_mode 判断文件类型,如果是目录则chdir()改变工作目录,递归调用opendir(”.“),调用完后chdir(”. .")再返回上一级目录。

选项-a

a=0时,如果文件名为".“或”. ."或第一个字符为’.',continue。

选项-t

先遍历一遍,得到该目录下一共有几个文件,新建一个结构体包括st_mtime和struct dirent *ent,动态分配相应大小的内存。然后rewinddir()在遍历一遍,把st_mtime和struct dirent *ent存入结构体数组。用qsort()给它降序排序。

遇到的问题

1.qsort()

​ 我写的qsort() 和cmp()应该是没问题的,但就是没排序,不得已用网上找的冒泡。(是Linux自带的头文件有问题吗??)

2.局部变量全局变量名相同

表示选项-i的全局变量i和循环变量i相同,导致不明意义的输出i节点号。

3.malloc()完之后要free()

不然会段错误 或"malloc(): corrupted top size"。

4.cv后记得改变量名

从别的函数cv过来后变量没有改为该函数内对应的变量名。

5.在chdir()后应opendir(“.”)

改变工作目录后又打开了工作目录的名字: “. .”(或是含路径的参数)会输出错误的路径里的内容。

以下为代码实现

#include <stdio.h>
#include <dirent.h>
#include <stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>typedef struct t{time_t time;struct dirent * Ent;
}file;int a,l,t,r,i,s,R,R0;
//long long int blocks;
int cmp(const void *a,const void *b);
void ls_t(DIR *dir);
void ls_R(struct dirent *ent);
int ls_s(struct dirent *ent);
void ls_l(struct dirent *ent);
void ls_read(DIR *dir);
void ls_open(char *dir_path);
void Bubble_sort(file list[],int N);void Bubble_sort(file list[],int N){int i, j;file t;// N 娑擃亜鍘撶槐鐙呯礉闁秴宸� N-1 濞嗭拷for (i = 0; i < N - 1; i++) {// 娴犲海顑� 1 娑擃亜鍘撶槐鐘茬磻婵浜堕崢鍡礉闁秴宸婚懛锟� N-1-ifor (j = 0; j < N - 1 - i; j++) {//濮f棁绶� list[j] 閸滐拷 list[j+1] 閻ㄥ嫬銇囩亸锟�if (list[j].time < list[j + 1].time) {//娴溿倖宕� 2 娑擃亜鍘撶槐鐘垫畱娴e秶鐤�t = list[j];list[j] = list[j + 1];list[j + 1] = t;}}}
}int cmp(const void *a,const void *b){file *aa=(file *)a;file *bb=(file *)b;return (bb->time-aa->time);
}//时间顺序
void ls_t(DIR *dir){int mount=0;struct dirent *ent; while ((ent = readdir(dir)) != NULL) {mount++;}file *fil=(file *)malloc((mount)*sizeof(file));mount=0;rewinddir(dir);int t=0;while((ent = readdir(dir)) != NULL){struct stat statbuf;stat(ent->d_name,&statbuf);fil[t].time=statbuf.st_mtime;fil[t].Ent=ent;t++;}Bubble_sort(fil,t); // for(int i=0;i<t;i++){//     printf("%lu     ",fil[i].time);// }// printf("\n");//   //qsort(fil,t,sizeof(file),cmp);//为什么不排序// for(int i=0;i<t;i++){//     printf("%lu     ",fil[i].time);// }int blocks=0;if(r==0){for(int i1=0;i1<t;i1++){if(a==0){if(strcmp(fil[i1].Ent->d_name,".")==0||strcmp(fil[i1].Ent->d_name,"..")==0||fil[i1].Ent->d_name[0]=='.')continue;}if(i==1){//没有选项-i但会在循环到ls.c时//在循环时i会不规律递增//循环变量名和-i选项重叠printf("%lu  ",fil[i].Ent->d_ino);}if(s==1){blocks+=ls_s(fil[i1].Ent);}if(l==1){ls_l(fil[i1].Ent);}printf("%s  ", fil[i1].Ent->d_name);if(l==1) printf("\n");}if(s==1){printf("\n总用量:  %d",blocks);blocks=0;}if(R==1){if(R0==1) printf("    结束\n");if(R0==0) R0=1;for(int i1=0;i1<t;i1++){if(a==0&&fil[i1].Ent->d_name[0]=='.') continue;//cv后变量没有改为该函数内对应的变量名if(strcmp(fil[i1].Ent->d_name,".")==0||strcmp(fil[i1].Ent->d_name,"..")==0)continue;ls_R(fil[i1].Ent);}}}if(r==1){for(int i1=t-1;i1>=0;i1--){if(a==0){if(strcmp(fil[i1].Ent->d_name,".")==0||strcmp(fil[i1].Ent->d_name,"..")==0||fil[i1].Ent->d_name[0]=='.')continue;}if(i==1){printf("%lu  ",fil[i1].Ent->d_ino);}if(s==1){blocks+=ls_s(fil[i1].Ent);}if(l==1){ls_l(fil[i1].Ent);}printf("%s  ", fil[i1].Ent->d_name);if(l==1) printf("\n");}if(s==1){printf("\n总用量:  %d",blocks);blocks=0;}if(R==1){if(R0==1) printf("    结束\n");if(R0==0) R0=1;for(int i1=0;i1<t;i1++){if(a==0&&fil[i1].Ent->d_name[0]=='.') continue;if(strcmp(fil[i1].Ent->d_name,".")==0||strcmp(fil[i1].Ent->d_name,"..")==0)continue;ls_R(fil[i1].Ent);}}}free(fil);
}//打开子目录
//如果是链接,不打开???
void ls_R(struct dirent *ent){struct stat statbuf;stat(ent->d_name,&statbuf);if(S_ISDIR(statbuf.st_mode)){// &&strcmp(ent->d_name,".")!=0&&strcmp(ent->d_name,"..")!=0char name[100];printf("\n%s/%s:\n",getcwd(name,100),ent->d_name);chdir(ent->d_name);ls_open(".");chdir("..");}}//块大小
//改为单个目录大小
int ls_s(struct dirent *ent){struct stat statbuf;
stat(ent->d_name,&statbuf);
printf("%lu  ",statbuf.st_blocks/2);
return statbuf.st_blocks/2;
}//详细属性
void ls_l(struct dirent *ent){struct stat statbuf;
stat(ent->d_name,&statbuf);switch (statbuf.st_mode & S_IFMT){case S_IFREG:printf("-");break;case S_IFCHR:printf("c");break;case S_IFBLK:printf("b");break;case S_IFDIR:printf("d");break;case S_IFIFO:printf("p");break;case S_IFLNK:printf("l");break;case S_IFSOCK:printf("s");break;}if(statbuf.st_mode&S_IRUSR)printf("r");else printf("-");if(statbuf.st_mode&S_IWUSR)printf("w");else printf("-");if(statbuf.st_mode&S_IXUSR)printf("x");else printf("-");if(statbuf.st_mode&S_IRGRP)printf("r");else printf("-");if(statbuf.st_mode&S_IWGRP)printf("w");else printf("-");if(statbuf.st_mode&S_IXGRP)printf("x");else printf("-");if(statbuf.st_mode&S_IROTH)printf("r");else printf("-");if(statbuf.st_mode&S_IWOTH)printf("w");else printf("-");if(statbuf.st_mode&S_IXOTH)printf("x");else printf("-");struct passwd *pw = getpwuid(statbuf.st_uid);struct group *gr = getgrgid(statbuf.st_gid);printf("  %lu  %s  %s  %ld  %s",statbuf.st_nlink,pw->pw_name,gr->gr_name,statbuf.st_blksize,ctime(&statbuf.st_mtime));// free(pw);// free(gr);
}void ls_read(DIR *dir){struct dirent *ent; int blocks=0;while ((ent = readdir(dir)) != NULL) {if(r==1){ls_read(dir);//while 改掉}if(a==0){if(strcmp(ent->d_name,".")==0||strcmp(ent->d_name,"..")==0||ent->d_name[0]=='.')continue;}if(i==1){printf("%lu  ",ent->d_ino);}if(s==1){blocks+=ls_s(ent);}if(l==1){ls_l(ent);}printf("%s  ", ent->d_name);if(l==1) printf("\n");}if(s==1){printf("\n总用量:  %d",blocks);blocks=0;}if(R==1){if(R0==1) printf("    结束\n");if(R0==0) R0=1;rewinddir(dir);while((ent=readdir(dir))!=NULL){if(a==0&&ent->d_name[0]=='.') continue;if(strcmp(ent->d_name,".")==0||strcmp(ent->d_name,"..")==0)continue;ls_R(ent);}}}void ls_open(char *dir_path){DIR *dir;if ((dir = opendir(dir_path)) != NULL) {if(t==1){ls_t(dir);}else {ls_read(dir);} closedir(dir);} else {perror("打开目录失败");exit(EXIT_FAILURE);}
}int main(int argc, char *argv[]) {DIR *dir;struct dirent *ent;char *dir_path = ".";int opt,opterr=0;while ((opt = getopt(argc, argv, "alRtris")) != -1) {switch (opt) {case 'a':a=1;break;case 'l':l=1;break;case 'R':R=1;break;case 't':t=1;break;case 'r':r=1;break;case 'i':i=1;break;case 's':s=1;break;case '?':printf("Unknown option: %c\n", optopt);break;}}if (optind<argc&&argc!=1){dir_path=argv[optind];chdir(dir_path);}ls_open(".");//改变工作目录后又打开了工作目录的名字 ".."(含路径的参数)会出错printf("\n");return EXIT_SUCCESS;
}

ls的a l i r R s t 功能的实现相关推荐

  1. 实现linux下 ls命令 (-a,-l,-R,-r,-i)

    ls各个命令的功能 -a : 显示所有文件,连同隐藏文件一起列出来 -l : 一行只显示一个文件的详细信息 -R: 递归输出文件 -r : 逆序输出文件名 -i : 输出文件的 i 节点的索引信息 遇 ...

  2. GPU Gems2 - 9 S.T.A.L.K.E.R.中的延迟着色(Deferred Shading in S.T.A.L.K.E.R.)

    关于延迟着色的详细技术及最新渲染管线技术可以参考我的这篇文章: https://blog.csdn.net/yinfourever/article/details/90263638 [章节概览] 本章 ...

  3. Wi n d o w s函数l s t r c m p和l s t r c m p i是作为对Wi n d o w s函数 C o m p a r e S t r i n g的调用来实现

    有两个字符串函数,即l s t r c m p和l s t r c m p i,它们的行为特性与等价的C运行期函数是不同的. C运行期函数s t r c m p.s t r c m p i.w c s ...

  4. J.R.R.托尔金笔下的中土世界与《斗破苍穹》项目实践:从世界观解构入手场景设计

    本期真经阁的特邀讲师将通过对<魔戒>与<霍比特人>这两部影视作品进行分析,为读者解构如何通过视觉上的表现设计来展现托尔金笔下的中土世界.并将其中讲述的方法应用在<斗破苍穹 ...

  5. 奇幻文学的鼻祖、善与恶的经典战争 《魔戒三部曲》[英]J.R.R.托尔金

    奇幻文学的鼻祖.善与恶的经典战争 <魔戒三部曲>[英]J.R.R.托尔金 下载地址...... 点击 https://51dr.cn/Book/Detail/1634 原文链接访问 公众号 ...

  6. Python中以字母r/R,或字母u/U 开头的字符串

    (1)以r或R开头的python中的字符串表示(非转义的)原始字符串 python里面的字符,如果开头处有个r,比如: (r'^time/plus/\d{1,2}/$', hours_ahead) 说 ...

  7. 佳能eosr控制环能否计算机控制,EOS R有哪些隐藏功能

    EOS R是佳能首款全画幅专业微单,在操控上有很多创新,加入了很多新功能.尤其是强调自定义功能,让用户有更多的参与感,满足不同用户的多样化需求.作为一款采用全新系统的微单,其操作体验自然相对此前的佳能 ...

  8. C语言学习之假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为p=(1+r)ⁿ r为年增长率,n为年数,p为与现在相比的倍数。

    假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值与现在相比增长多少百分比.计算公式为p=(1+r)ⁿ r为年增长率,n为年数,p为与现在相比的倍数. #include <std ...

  9. python 文件读写with open模式r,r+ w,w+ a,a+区别详解

    python 文件读写with open模式r,r+ w,w+ a,a+区别详解 python中的 with open主要要来进行文件读写的操作 在 Python 中使用文件的关键函数是 open() ...

最新文章

  1. 干货丨人脸识别必读的N篇文章
  2. pycharm中导入allure提示模块不存在解决方法
  3. Java语法基础-2
  4. weblogic部署ssh2应用出现异常
  5. vue2.0 新手教程(一)
  6. 2014年2月份第3周51Aspx源码发布详情
  7. Oracle Sql 胡乱记
  8. 安卓获取mysql数据封装方法_android SQLite数据库封装
  9. Maven : error: missing or invalid dependency detected while loading class file 'RDD.class'
  10. Java基础学习总结(33)——Java8 十大新特性详解
  11. Eduline在线教育系统源码 带完整修复后台
  12. 深度学习人工智能中编写程序
  13. 服务器 linux raid驱动,Dell PowerEdge R710服务器安装CentOS 5.5加载Raid卡驱动 | 系统运维...
  14. 数据仓库ETL工具箱——简介
  15. MTK8788,6765,通用平台的按键驱动添加
  16. 灵活使用CSS内联样式
  17. Ensembl数据库简介
  18. 毛利率逼近茅台,巨子生物赴港IPO市场会买单吗?
  19. ElementUI表格多选数据处理
  20. 数码相机和单反相机区别

热门文章

  1. HTTP URL地址栏特殊字符对应表
  2. JanusGraph单机部署
  3. 快递API接口快递接口快递查询API教程
  4. 大数据Java基础之集合
  5. 腾讯音乐事业群 Android 移动客户端面经,成功斩获offer!
  6. SPEC文件参数查阅
  7. 简述C++虚函数作用及底层实现原理
  8. PowerMockup一个产品原型设计PPT插件
  9. springboot 项目 使用 tess4j 识别文字
  10. java之spring中时间戳转换时间方式