ls 操作命令 -l/-R和rm -r dir 功能实现
1 ls -R 2 #include <sys/stat.h> 3 #include <dirent.h> 4 #include <fcntl.h> 5 #include <stdbool.h> 6 #include <stdio.h> 7 8 9 int do_ls(const char *dir) 10 { 11 char dir_name[128]; 12 DIR *dirp; 13 struct dirent *dp; 14 struct stat dir_stat; 15 16 if ( 0 != access(dir, F_OK) ) 17 { 18 return 0; 19 } 20 21 if ( 0 > stat(dir, &dir_stat) ) 22 { 23 perror("get directory stat error"); 24 return -1; 25 } 26 27 28 if ( S_ISDIR(dir_stat.st_mode) ) 29 { 30 dirp = opendir(dir); 31 printf("%s:\n",dir); 32 int count = 0; 33 while ( (dp=readdir(dirp)) != NULL ) 34 { 35 36 ++count; 37 if ( (0 == strcmp(".", dp->d_name)) || (0 == strcmp("..", dp->d_name)) ) { 38 continue; 39 } 40 printf("%s\t",dp->d_name); 41 if(5 == count) 42 { 43 printf("\n"); 44 count = 0; 45 } 46 47 } 48 printf("\n---\n"); 49 rewinddir(dirp); 50 51 while ( (dp=readdir(dirp)) != NULL ) 52 { 53 if ( (0 == strcmp(".", dp->d_name)) || (0 == strcmp("..", dp->d_name)) ) { 54 continue; 55 } 56 57 char buf[100] = {}; 58 sprintf(buf,"%s/%s",dir,dp->d_name); 59 do_ls(buf); 60 61 } 62 } 63 64 } 65 int main() 66 { 67 do_ls("."); 68 }
rm -r
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <sys/types.h> 4 #include <sys/stat.h> 5 #include <unistd.h> 6 #include <fcntl.h> 7 #include <dirent.h> 8 #include <libgen.h> 9 #include <string.h> 10 void rmr(char* path) 11 { 12 DIR* dir = opendir(path); 13 if(dir == NULL) 14 perror("opendir"),exit(-1); 15 struct dirent* ent; 16 char buf[256]; 17 while((ent=readdir(dir))) 18 { 19 if(ent->d_type == 4) 20 { 21 if(strcmp(ent->d_name,".")==0||strcmp(ent->d_name,"..")==0) 22 continue; 23 sprintf(buf,"%s/%s",path,ent->d_name); 24 25 rmr(buf); 26 27 } 28 if(ent->d_type == 8) 29 { 30 sprintf(buf,"%s/%s",path,ent->d_name); 31 if(remove(buf)!=0) perror("remove"),exit(-1); 32 } 33 } 34 if(rmdir(path)!=0) perror("rmdir"),exit(-1); 35 } 36 int main(int argc,char* argv[]) 37 { 38 if(argc != 2) 39 { 40 printf("Usage:%s directory name",basename(argv[0])); 41 exit(-1); 42 } 43 44 rmr(argv[1]); 45 printf("rm -r %s success.\n",argv[1]); 46 return 0; 47 }
1 ls -l 2 #include <stdio.h> 3 #include <sys/types.h> 4 #include <dirent.h> 5 #include <sys/stat.h> 6 #include <pwd.h> 7 #include <grp.h> 8 #include <unistd.h> 9 10 void show_file_info(char* filename, struct stat* info_p) 11 { 12 char* uid_to_name(), *ctime(), *gid_to_name(), *filemode(); 13 void mode_to_letters(); 14 char modestr[11]; 15 16 mode_to_letters(info_p->st_mode, modestr); 17 18 printf("%s", modestr); 19 printf(" %4d", (int) info_p->st_nlink); 20 printf(" %-8s", uid_to_name(info_p->st_uid)); 21 printf(" %-8s", gid_to_name(info_p->st_gid)); 22 printf(" %8ld", (long) info_p->st_size); 23 printf(" %.12s", 4 + ctime(&info_p->st_mtime)); 24 struct passwd *curr; 25 curr = getpwuid(getuid()); 26 27 if(curr->pw_gid == info_p->st_gid && info_p->st_mode & S_IXGRP ) 28 { 29 printf("\033[0;32m"); 30 } 31 32 if(curr->pw_gid == info_p->st_gid && curr->pw_uid == info_p->st_uid && info_p->st_mode & S_IXUSR ) 33 { 34 printf("\033[0;32m"); 35 } 36 37 if(info_p->st_mode & S_IXOTH) 38 { 39 printf("\033[0;32m"); 40 } 41 42 printf(" %s\n",filename); 43 printf("\033[0m"); 44 } 45 46 void mode_to_letters(int mode, char str[]) 47 { 48 strcpy(str,"----------"); 49 50 if (S_ISDIR(mode)) 51 { 52 str[0] = 'd'; 53 } 54 55 if (S_ISCHR(mode)) 56 { 57 str[0] = 'c'; 58 } 59 60 if (S_ISBLK(mode)) 61 { 62 str[0] = 'b'; 63 } 64 65 if ((mode & S_IRUSR)) 66 { 67 str[1] = 'r'; 68 } 69 70 if ((mode & S_IWUSR)) 71 { 72 str[2] = 'w'; 73 } 74 75 if ((mode & S_IXUSR)) 76 { 77 str[3] = 'x'; 78 } 79 80 if ((mode & S_IRGRP)) 81 { 82 str[4] = 'r'; 83 } 84 85 if ((mode & S_IWGRP)) 86 { 87 str[5] = 'w'; 88 } 89 90 if ((mode & S_IXGRP)) 91 { 92 str[6] = 'x'; 93 } 94 95 if ((mode & S_IROTH)) 96 { 97 str[7] = 'r'; 98 } 99 100 if ((mode & S_IWOTH)) 101 { 102 str[8] = 'w'; 103 } 104 105 if ((mode & S_IXOTH)) 106 { 107 str[9] = 'x'; 108 } 109 } 110 111 char* uid_to_name(uid_t uid) 112 { 113 struct passwd* getpwuid(),* pw_ptr; 114 static char numstr[10]; 115 116 if((pw_ptr = getpwuid(uid)) == NULL) 117 { 118 sprintf(numstr,"%d",uid); 119 120 return numstr; 121 } 122 else 123 { 124 return pw_ptr->pw_name; 125 } 126 } 127 128 char* gid_to_name(gid_t gid) 129 { 130 struct group* getgrgid(),* grp_ptr; 131 static char numstr[10]; 132 133 if(( grp_ptr = getgrgid(gid)) == NULL) 134 { 135 sprintf(numstr,"%d",gid); 136 return numstr; 137 } 138 else 139 { 140 return grp_ptr->gr_name; 141 } 142 } 143 void do_ls(char dirname[]) 144 { 145 DIR* dir_ptr; 146 struct dirent* direntp; 147 148 if ((dir_ptr = opendir(dirname)) == NULL) 149 { 150 fprintf(stderr, "ls2: cannot open %s \n", dirname); 151 } 152 else 153 { 154 while ((direntp = readdir(dir_ptr)) != NULL) 155 { 156 dostat(direntp->d_name); 157 } 158 159 close(dir_ptr); 160 } 161 } 162 163 void dostat(char* filename) 164 { 165 struct stat info; 166 167 if (stat(filename, &info) == -1) 168 { 169 perror(filename); 170 } 171 else 172 { 173 show_file_info(filename, &info); 174 } 175 } 176 177 int main(int ac,char* av[]) 178 { 179 if(ac == 1) 180 { 181 do_ls("."); 182 } 183 else 184 { 185 while(--ac) 186 { 187 printf("%s: \n",++*av); 188 do_ls(*av); 189 } 190 } 191 }
博客是我在大海中捞到针的神器