首页 > 其他 > 详细

myls

时间:2019-03-15 18:16:00      阅读:180      评论:0      收藏:0      [点我收藏+]
  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <unistd.h>
  5 #include <pwd.h>
  6 #include <grp.h>
  7 #include <time.h>
  8 #include <errno.h>
  9 #include <dirent.h>
 10 #include <string.h>
 11 #include <stdlib.h>
 12 
 13 int llstat(char *p);
 14 int  astat(char *p);
 15 int  istat(char *p);
 16 int  hstat(char *p);
 17 static int nums;
 18 
 19 int main(int argc, char **argv)
 20 {
 21     int c;
 22     char *optstring = "-laih";
 23     if(argc < 3)    
 24         return 1;
 25     while (1){
 26         c = getopt(argc, argv, optstring);
 27         if(c == -1)
 28             break;
 29         switch(c){
 30             case l: llstat(argv[2]);break;
 31             case a: astat(argv[2]);break;
 32             case i: istat(argv[2]);break;
 33             case h: hstat(argv[2]);break;        
 34         //    case ‘1‘: printf("非选项参数\n");break;
 35             case ?: printf("?\n");break;
 36             default : break;
 37         }    
 38     }
 39     return 0;
 40 
 41 }
 42 
 43 //-l
 44 //文件名->路径
 45 static char *buf_cat(const char *p, const char *name)
 46 {
 47     char *bufcat = malloc(1024);
 48     memset(bufcat,\0,1024);
 49     strcpy(bufcat,p);
 50     strcat(bufcat,"/");
 51     strcat(bufcat,name);
 52     return bufcat;
 53 }
 54 // 判断是否为隐藏文件
 55 static int is_i(const char *p)
 56 {
 57     if(*p == .)
 58         return 1;
 59     else
 60         return 0;
 61 }
 62 
 63 int l_llstat(const char *p, const char *name)
 64 {
 65     struct stat mystat;
 66     struct passwd *pwd = NULL;
 67     struct group *grp = NULL;
 68     struct tm *tmp = NULL;
 69     char *buf=NULL;
 70 
 71     buf = buf_cat(p,name);
 72     if(lstat(buf,&mystat) == -1){
 73         perror("stat()");
 74         return 1;
 75     }
 76     if(is_i(name) == 0){
 77         nums+=mystat.st_blocks/2;
 78 
 79         //类型
 80         switch(mystat.st_mode & S_IFMT){
 81             case S_IFSOCK : putchar(s);break;
 82             case S_IFLNK : putchar(l);break;
 83             case S_IFREG : putchar(-);break;
 84             case S_IFBLK : putchar(b);break;
 85             case S_IFDIR : putchar(d);break;
 86             case S_IFCHR : putchar(c);break;
 87             case S_IFIFO : putchar(p);break;
 88             default: break;
 89         }
 90         //权限
 91         if(mystat.st_mode & S_IRUSR)
 92             putchar(r);
 93         else
 94             putchar(-);
 95         if(mystat.st_mode & S_IWUSR)
 96             putchar(w);
 97         else
 98             putchar(-);
 99         if(mystat.st_mode & S_IXUSR){
100             if(mystat.st_mode & S_ISUID)
101                 putchar(s);
102             else
103                 putchar(x);
104         }
105         else
106             putchar(-);
107 
108         if(mystat.st_mode & S_IRGRP)
109             putchar(r);
110         else
111             putchar(-);
112         if(mystat.st_mode & S_IWGRP)
113             putchar(w);
114         else
115             putchar(-);
116         if(mystat.st_mode & S_IXGRP){
117             if(mystat.st_mode & S_ISGID)
118                 putchar(s);
119             else
120                 putchar(x);
121         }
122         else
123             putchar(-);
124 
125         if(mystat.st_mode & S_IROTH)
126             putchar(r);
127         else
128             putchar(-);
129         if(mystat.st_mode & S_IWOTH)
130             putchar(w);
131         else
132             putchar(-);
133         if(mystat.st_mode & S_IXOTH){
134             if(mystat.st_mode & S_ISVTX)
135                 putchar(t);
136             else
137                 putchar(x);
138         }
139         else
140             putchar(-);    
141         //硬链接
142         printf(" %ld ", mystat.st_nlink);
143         //文件拥有者名
144         pwd = getpwuid(mystat.st_uid);
145         printf("%s ", pwd->pw_name);
146         //文件所有组
147         grp = getgrgid(mystat.st_gid);
148         printf("%s ",grp->gr_name);
149         //总字节个数 
150         printf("%5ld ", mystat.st_size);
151         //获取文件时间 
152         tmp = localtime(&mystat.st_mtim.tv_sec);
153         strftime(buf, 1024, "%m月  %d %H:%M", tmp);
154         printf("%s ", buf);
155         //文件名
156         printf("%s\n", name);
157     }
158     return 0;
159 }
160 
161 int llstat(char *p)
162 {
163     DIR *dp = NULL;
164     struct dirent *entry = NULL;
165     char buf[1024] = {};
166     struct stat mystat1;
167     if(lstat(p,&mystat1) == -1){
168         perror("stat()");
169         return 1;
170     }
171     if(S_ISREG(mystat1.st_mode)){
172         l_llstat(".", p);
173     }else{
174         dp = opendir(p);
175         if(dp == NULL){
176             perror("opendir()");
177             return 1;
178         }
179 
180         while(1){
181             entry = readdir(dp);
182             if(NULL == entry){
183                 if(errno){
184                     perror("readdir()");
185                     closedir(dp);
186                     return 1;
187                 }
188                 break;
189             }
190             l_llstat(p, entry->d_name);
191         }
192         printf("总用量:%d\n", nums);
193         closedir(dp);
194     }    return 0;
195 
196 }
197 
198 
199 
200 // a
201 
202 int a_llstat(const char *p, const char *name)
203 {
204     struct stat mystat;
205     char *buf=NULL;
206 
207     buf = buf_cat(p,name);
208     if(lstat(buf,&mystat) == -1){
209         perror("stat()");
210         return 1;
211     }
212     //文件名
213     printf("%s ", name);
214     return 0;
215 }
216 
217 int  astat(char *p)
218 {
219     struct stat mystat2;
220     struct dirent *entry = NULL;
221     DIR *dp = NULL;
222     if(lstat(p,&mystat2) == -1){
223         perror("stat()");
224         return 1;
225      }
226     
227     if(S_ISREG(mystat2.st_mode)){
228         printf("%s ", p);
229     }
230         dp= opendir(p);
231         if(dp == NULL){
232             perror("opendir()");
233             return 1;
234         }
235 
236         while(1){
237             entry = readdir(dp);
238             if(NULL == entry){
239                 if(errno){
240                     perror("readdir()");
241                     closedir(dp);
242                     return 1;
243                 }
244                 break;
245             }
246             a_llstat(p, entry->d_name);
247         }
248     
249     closedir(dp);
250     printf("\n");
251     return 0;
252 
253 }
254 
255 // i
256 
257 int i_llstat(const char *p, const char *name)
258 {
259     struct stat mystat;
260     char *buf=NULL;
261 
262     buf = buf_cat(p,name);
263     if(lstat(buf,&mystat) == -1){
264         perror("stat()");
265         return 1;
266     }
267     printf("%ld  ",mystat.st_ino);
268     //文件名
269     printf("%s  ", name);
270     return 0;
271 }
272 
273 int  istat(char *p)
274 {
275     struct stat mystat2;
276     struct dirent *entry = NULL;
277     DIR *dp = NULL;
278     if(lstat(p,&mystat2) == -1){
279         perror("stat()");
280         return 1;
281      }
282 
283     if(S_ISREG(mystat2.st_mode)){
284         if(is_i(p))
285             return 1;
286         printf("%ld ",mystat2.st_ino);
287         printf("%s ", p);
288     }
289     else{
290         dp= opendir(p);
291         if(dp == NULL){
292             perror("opendir()");
293             return 1;
294         }
295 
296         while(1){
297             entry = readdir(dp);
298             if(NULL == entry){
299                 if(errno){
300                     perror("readdir()");
301                     closedir(dp);
302                     return 1;
303                 }
304                 break;
305             }
306             if(is_i(entry->d_name))
307                 continue;
308             i_llstat(p, entry->d_name);
309         }
310     }
311     closedir(dp);
312     printf("\n");
313     return 0;
314 }
315 
316 //h
317 int  hstat(char *p)
318 {
319     struct stat mystat2;
320     struct dirent *entry = NULL;
321     DIR *dp = NULL;
322     if(lstat(p,&mystat2) == -1){
323         perror("stat()");
324         return 1;
325     }
326 
327     if(!((mystat2.st_mode & S_IFMT) == S_IFDIR)){
328         if(!is_i(p)){
329             printf("%s\n", p);
330             return 1;
331         }
332     } else{
333 
334         dp= opendir(p);
335         if(dp == NULL){
336             perror("opendir()");
337             return 1;
338         }
339 
340         while(1){
341             entry = readdir(dp);
342             if(NULL == entry){
343                 if(errno){
344                     perror("readdir()");
345                     closedir(dp);
346                     return 1;
347                 }
348                 break;
349             }
350         if(is_i(entry->d_name) == 0)
351             printf("%s  ", entry->d_name);
352         }
353         closedir(dp);
354     }
355     printf("\n");
356     return 0;
357 }

 

myls

原文:https://www.cnblogs.com/ylx0506/p/10538579.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!