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 %s\n",pstat.st_ino,path); 175 return; 176 } 177 strcpy(buf,path); 178 strcat(buf,"/*"); 179 glob(buf,0,NULL,&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 %s\n",pstat.st_ino,++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("不认识此选项%s\n",argv[optind-1]); 294 break; 295 case 1: 296 printf("非选项参数%s\n",argv[optind-1]); 297 break; 298 default : 299 break; 300 } 301 } 302 return 0; 303 }
原文:https://www.cnblogs.com/KbBryant24/p/10543391.html