加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

my-ls--初步调试

发布时间:2020-12-14 02:01:22 所属栏目:Linux 来源:网络整理
导读:1 #includestdio.h 2 #includeunistd.h 3 #includesys/types.h 4 #includesys/stat.h 5 #includefcntl.h 6 #includepwd.h 7 #includegrp.h 8 #includeerrno.h 9 #includetime.h 10 #includedirent.h 11 #includeglob.h 12 #include string .h 13 14 #define
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 #include<sys/stat.h>
  5 #include<fcntl.h>
  6 #include<pwd.h>
  7 #include<grp.h>
  8 #include<errno.h>
  9 #include<time.h>
 10 #include<dirent.h>
 11 #include<glob.h>
 12 #include<string.h>
 13 
 14 #define BUFSIZE 100
 15 #define BUFFSIZE 1024
 16 
 17 void statjudge(char *path);
 18 void listl(char *path);
 19 void listi(char *path);
 20 void lista(char *path);
 21 void listh(char *path);
 22 
 23 
 24 void statjudge(char *path)
 25 {
 26     struct stat mystat;
 27 
 28     if(stat(path,&mystat)==-1)
 29     {
 30         perror("stat()");
 31         return ;
 32     }
 33     switch(mystat.st_mode&S_IFMT)
 34     {
 35         case S_IFSOCK:
 36             printf("s");
 37             break;
 38         case S_IFLNK:
 39             printf("l");
 40             break;
 41         case S_IFREG:
 42             printf("-");
 43             break;
 44         case S_IFBLK:
 45             printf("b");
 46             break;
 47         case S_IFDIR:
 48             printf("d");
 49             break;
 50         case S_IFCHR:
 51             printf("c");
 52             break;
 53         case S_IFIFO:
 54             printf("P");
 55             break;
 56         fefault:
 57             break;
 58     }
 59 
 60     if(mystat.st_mode&S_IRUSR)
 61         putchar(r);
 62     else
 63         putchar(-);
 64     if(mystat.st_mode&S_IWUSR)
 65         putchar(w);
 66     else
 67         putchar(-);
 68     if(mystat.st_mode&S_IXUSR)
 69         if(mystat.st_mode&S_ISUID)
 70             putchar(s);
 71         else
 72             putchar(x);
 73     else
 74         putchar(-);
 75     if(mystat.st_mode & S_IRGRP)
 76         putchar(r);
 77     else
 78         putchar(-);
 79     if(mystat.st_mode & S_IWGRP)
 80         putchar(w);
 81     else
 82         putchar(-);
 83     if(mystat.st_mode & S_IXGRP)
 84         if(mystat.st_mode & S_ISGID)
 85             putchar(s);
 86         else
 87             putchar(x);
 88     else
 89         putchar(-);
 90     if(mystat.st_mode & S_IROTH)
 91         putchar(r);
 92     else
 93         putchar(-);
 94     if(mystat.st_mode & S_IWOTH)
 95         putchar(w);
 96     else
 97         putchar(-);
 98     if(mystat.st_mode & S_IXOTH)
 99         if(mystat.st_mode & S_ISVTX)
100             putchar(t);
101         else
102             putchar(x);
103     else
104         putchar(-);
105 
106     printf(" %ld",mystat.st_nlink);
107 
108     //文件拥有者
109     struct passwd *pwd=NULL;
110     pwd = getpwuid(mystat.st_uid);
111     printf(" %s ",pwd->pw_name);
112 
113     //文件所属组
114     struct group *grp=NULL;
115     grp=getgrgid(mystat.st_gid);
116     printf(" %s ",grp->gr_name);
117 
118     //总字节个数
119     printf(" %ld ",mystat.st_size);
120 
121     //获取文件时间 atime mtime ctime
122     struct tm *tmp=NULL;
123     tmp=localtime(&mystat.st_mtim.tv_sec);
124 
125     //if error
126     char buf[BUFSIZE]={};
127     strftime(buf,BUFSIZE,"%m月 %d   %H:%M ",tmp);
128     printf("%s ",buf);
129 
130     //文件名
131     char *p=strrchr(path,/);
132     printf("%s ",++p);
133     putchar(n);
134     return ;
135 }
136 
137 void listl(char *path)
138 {
139     struct stat pstat;
140     glob_t pglob;
141     char buf[BUFFSIZE]={};
142     if(lstat(path,&pstat)<0)
143     {
144         perror("lstat()");
145         return;
146     }
147     if(!S_ISDIR(pstat.st_mode))
148     {
149         statjudge(path);
150         return;
151     }
152     strcpy(buf,path);
153     strcat(buf,"/*");
154     glob(buf,0,NULL,&pglob);
155     for(int i=0;i<pglob.gl_pathc;i++)
156     {
157         statjudge((pglob.gl_pathv)[i]);    
158     }
159     globfree(&pglob);
160 }
161 
162 void listi(char *path)
163 {
164     struct stat pstat;
165     glob_t pglob;
166     char buf[BUFFSIZE]={};
167     if(lstat(path,&pstat)<0)
168     {
169         perror("lstat()");
170         return;
171     }
172     if(!S_ISDIR(pstat.st_mode))
173     {
174         printf("%ld  %sn",pstat.st_ino,path);
175         return;
176     }
177     strcpy(buf,path);
178     strcat(buf,"/*");
179     glob(buf,&pglob);
180     for(int i=0;i<pglob.gl_pathc;i++)
181     {
182         if(lstat(((pglob.gl_pathv)[i]),&pstat)<0)
183         {
184             perror("lstat()");
185             return;
186         }
187         char *o=strrchr((pglob.gl_pathv)[i],/);
188         printf("%ld  %sn",++o);
189     }
190     globfree(&pglob);
191 
192 }
193 
194 void lista(char *path)
195 {
196     struct stat pstat;
197     glob_t pglob;
198     char buf[BUFFSIZE]={};
199     if(lstat(path,&pstat)<0)
200     {
201         perror("lstat()");
202         return;
203     }
204     if(!S_ISDIR(pstat.st_mode))
205     {
206         printf("%s  ",path);
207         return;
208     }
209     DIR *dp=opendir(path);
210     struct dirent *rd=NULL;
211     while(1)
212     {
213         rd=readdir(dp);
214         if(rd==NULL)
215         {
216             if(errno)
217             {
218                 perror("readdir()");
219                 closedir(dp);
220                 return;
221             }
222             break;
223         }
224         printf("%s  ",rd->d_name);
225     }
226     closedir(dp);
227     printf("n");
228     return;
229 }
230 
231 void listh(char *path)
232 {
233     struct stat pstat;
234     glob_t pglob;
235     char buf[BUFFSIZE]={};
236     if(lstat(path,&pstat)<0)
237     {
238         perror("lstat()");
239         return;
240     }
241     if(!S_ISDIR(pstat.st_mode))
242     {
243         printf("%s  ",path);
244         return;
245     }
246     DIR *dp=opendir(path);
247     struct dirent *rd=NULL;
248     while(1)
249     {
250         rd=readdir(dp);
251         if(rd==NULL)
252         {
253             if(errno)
254             {
255                 perror("readdir()");
256                 closedir(dp);
257                 return;
258             }
259             break;
260         }
261         if((rd->d_name)[0]==.)
262             continue;
263         printf("%s  ",rd->d_name);
264     }
265     closedir(dp);
266     printf("n");
267 }
268 
269 int main(int argc,char *argv[])
270 {
271     char *optstring="-l:i:a:h:";
272     int a;
273     while(1)
274     {
275         a=getopt(argc,argv,optstring);    
276         if(a==-1)
277             break;
278         switch(a)
279         {
280             case l:
281                 listl(optarg);
282                 break;
283             case i:
284                 listi(optarg);
285                 break;
286             case a:
287                 lista(optarg);
288                 break;
289             case h:
290                 listh(optarg);
291                 break;
292             case ?:
293                 printf("不认识此选项%sn",argv[optind-1]);
294                 break;
295             case 1:
296                 printf("非选项参数%sn",argv[optind-1]);
297                 break;
298             default :
299                 break;
300         }
301     }
302     return 0;
303 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读