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 }