myls
1 #include <stdio.h> 2 #include <string.h> 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <unistd.h> 6 #include <pwd.h> 7 #include <grp.h> 8 #include <time.h> 9 #include <dirent.h> 10 #include <errno.h> 11 12 #define BUFSIZE 1024 13 14 static void l(char *p); 15 static void a(char *p); 16 static void i(char *p); 17 static void h(char *p); 18 static void mulu(char *p); 19 static void quanxian(struct stat mystat); 20 21 22 23 //是目录 24 static void mulu(char *p) 25 { 26 struct dirent *read = NULL; 27 DIR *dir = NULL; 28 struct stat mystat; 29 char buf[BUFSIZE] = {}; 30 31 dir = opendir(p); 32 if (p == NULL) { 33 perror("opendir()..."); 34 return; 35 } 36 37 while (1) { 38 read = readdir(dir); 39 if (NULL == read) { 40 if (errno) { 41 perror("readdir()..."); 42 closedir(dir); 43 return; 44 } 45 break; 46 } 47 memset(buf, '\0', BUFSIZE); 48 strcpy(buf, p); 49 strcat(buf, "/"); 50 strcat(buf, read->d_name); 51 52 if (stat(buf, &mystat) == -1) { 53 perror("stat()"); 54 return ; 55 } 56 switch (mystat.st_mode & S_IFMT) { 57 case S_IFREG: 58 putchar('-'); 59 break; 60 case S_IFSOCK: 61 putchar('s'); 62 break; 63 case S_IFLNK: 64 putchar('l'); 65 break; 66 case S_IFBLK: 67 putchar('b'); 68 break; 69 case S_IFDIR: 70 putchar('d'); 71 break; 72 case S_IFCHR: 73 putchar('c'); 74 break; 75 case S_IFIFO: 76 putchar('p'); 77 break; 78 default: 79 break; 80 } 81 quanxian(mystat); 82 printf("%s", read->d_name); 83 putchar('\n'); 84 } 85 closedir(dir); 86 return; 87 } 88 //是文件 89 90 //读信息 91 static void quanxian(struct stat mystat) 92 93 { 94 //*****************可读可写可执行 95 if (mystat.st_mode & S_IRUSR) 96 putchar('r'); 97 else 98 putchar('-'); 99 if (mystat.st_mode & S_IWUSR) 100 putchar('w'); 101 else 102 putchar('-'); 103 if (mystat.st_mode & S_IXUSR) 104 putchar('x'); 105 else 106 putchar('-'); 107 if (mystat.st_mode & S_IRGRP) 108 putchar('r'); 109 else 110 putchar('-'); 111 if (mystat.st_mode & S_IWGRP) 112 putchar('w'); 113 else 114 putchar('-'); 115 if (mystat.st_mode & S_IXGRP) 116 putchar('x'); 117 else 118 putchar('-'); 119 if (mystat.st_mode & S_IROTH) 120 putchar('r'); 121 else 122 putchar('-'); 123 if (mystat.st_mode & S_IWOTH) 124 putchar('w'); 125 else 126 putchar('-'); 127 if (mystat.st_mode & S_IXOTH) 128 putchar('x'); 129 else 130 putchar('-'); 131 //*******************其他信息 132 printf(" %ld ", mystat.st_nlink); 133 134 struct passwd *pwd = NULL;//man 3 getgrpid 135 pwd = getpwuid(mystat.st_uid); 136 printf("%s ",pwd->pw_name); 137 138 struct group *grp = NULL;//man 3 getgegid 139 grp = getgrgid(mystat.st_gid); 140 printf("%s ", grp->gr_name); 141 142 printf("%ld ", mystat.st_size); 143 144 struct tm *t = NULL; 145 t = localtime(&mystat.st_mtim.tv_sec); 146 //if error 147 char buf[1024] = {}; 148 strftime(buf, 1024, "%m月 %d %H:%M", t); 149 printf("%s ",buf); 150 } 151 152 static void l(char *p) 153 { 154 struct stat mystat; 155 if (stat(p, &mystat) == -1) { 156 perror("stat()"); 157 return; 158 } 159 switch (mystat.st_mode & S_IFMT) { 160 case S_IFDIR: 161 mulu(p); 162 break; 163 case S_IFREG: case S_IFSOCK: case S_IFLNK: 164 case S_IFBLK: case S_IFCHR: case S_IFIFO: 165 quanxian(mystat); 166 printf("%s \n", p); 167 break; 168 default: 169 break; 170 } 171 172 } 173 174 static void a(char *p) 175 { 176 struct dirent *read = NULL; 177 DIR *dir = NULL; 178 int i = 0; 179 180 dir = opendir(p); 181 if (p == NULL) { 182 perror("opendir()..."); 183 return; 184 } 185 186 while (1) { 187 read = readdir(dir); 188 if (NULL == read) { 189 if (errno) { 190 perror("readdir()..."); 191 closedir(dir); 192 return; 193 } 194 break; 195 } 196 printf("%s ", read->d_name); 197 i++; 198 if (!(i % 5)) 199 printf("\n"); 200 } 201 printf("\n"); 202 closedir(dir); 203 return; 204 } 205 206 static void i(char *p) 207 { 208 struct dirent *read = NULL; 209 DIR *dir = NULL; 210 struct stat mystat; 211 char buf[BUFSIZE] = {}; 212 213 dir = opendir(p); 214 if (p == NULL) { 215 perror("opendir()..."); 216 return; 217 } 218 219 while (1) { 220 read = readdir(dir); 221 if (NULL == read) { 222 if (errno) { 223 perror("readdir()..."); 224 closedir(dir); 225 return; 226 } 227 break; 228 } 229 memset(buf, '\0', BUFSIZE); 230 strcpy(buf, p); 231 strcat(buf, "/"); 232 strcat(buf, read->d_name); 233 if (stat(buf, &mystat) == -1) { 234 perror("stat()"); 235 return ; 236 } 237 printf("%ld %s\n",mystat.st_ino, read->d_name); 238 } 239 closedir(dir); 240 return; 241 } 242 243 static void h(char *p) 244 { 245 struct dirent *read = NULL; 246 DIR *dir = NULL; 247 int i = 0; 248 249 dir = opendir(p); 250 if (p == NULL) { 251 perror("opendir()..."); 252 return; 253 } 254 255 while (1) { 256 read = readdir(dir); 257 if (NULL == read) { 258 if (errno) { 259 perror("readdir()..."); 260 closedir(dir); 261 return; 262 } 263 break; 264 } 265 if (!strcmp(read->d_name, ".") || !strcmp(read->d_name, "..")) 266 continue; 267 printf("%s ", read->d_name); 268 i++; 269 if (!(i % 5)) 270 printf("\n"); 271 } 272 printf("\n"); 273 closedir(dir); 274 return; 275 } 276 int main(int argc, char *argv[]) 277 { 278 char *optstring = "-l::a:h:i:"; 279 int c; 280 while (1) { 281 c = getopt(argc, argv, optstring); 282 if (c == -1) 283 break; 284 switch (c) { 285 case 'l': //显示目录和文件信息 286 l(argv[2]); 287 break; 288 case 'a': //显示文件名包括隐藏文件 289 a(argv[2]); 290 break; 291 case 'h': //显示文件名,不含隐藏文件 292 h(argv[2]); 293 break; 294 case 'i': //显示文件inode和文件名 295 i(argv[2]); 296 break; 297 } 298 } 299 300 return 0; 301 }