您的位置:首页 > 其它

ubuntu 编写自己的ls命令

2015-05-07 15:38 323 查看
Refer: ubuntu 编写自己的ls命令

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
#include <unistd.h>
#include <grp.h>
#include <pwd.h>
#include <time.h>

int cmp(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}

int display_file(char *path, char *filename)
{
struct stat st;
int i;
struct passwd *pw;
struct group *gr;
struct tm *tm;
stat(path, &st);

switch(st.st_mode &S_IFMT)
{
case S_IFREG:  printf("-");    break;
case S_IFDIR:  printf("d");    break;
case S_IFLNK:  printf("l");    break;
case S_IFBLK:  printf("b");    break;
case S_IFCHR:  printf("c");    break;
case S_IFIFO:  printf("p");    break;
case S_IFSOCK: printf("s");    break;
}

for(i = 8; i >= 0; i--)
{
if(st.st_mode & (1 << i))
{
switch(i%3)
{
case 2: printf("r"); break;
case 1: printf("w"); break;
case 0: printf("x"); break;
}
}
else
printf("-");
}

pw = getpwuid(st.st_uid);
gr = getgrgid(st.st_gid);

printf("%2d %s %s %4ld", st.st_nlink, pw->pw_name, gr->gr_name, st.st_size);

tm = localtime(&st.st_ctime);
printf(" %04d-%02d-%02d %02d:%02d",tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min);

printf(" %s\n", filename);

return 0;
}

int do_ls(char dirname[])
{
DIR *dir_ptr;
struct dirent *direntp;
struct stat st;

if((dir_ptr = opendir(dirname))==NULL)
fprintf(stderr, "ls1:can not open %s\n", dirname);
else{
char res[500][256]; //buf[256];
int reslen = 0, i;
//strcpy(buf, dirname);
//strcat(buf, "/");
while((direntp = readdir(dir_ptr)) != NULL){
strcpy(res[reslen], direntp->d_name);
reslen++;
}
closedir(dir_ptr);
qsort(res, reslen, sizeof(res[0]), cmp);
//strcat(buf, dirent->d_name);
for(i = 0; i<reslen; i++)
{
char buf[256]={0};
strcpy(buf, dirname);
strcat(buf, "/");
strcat(buf, res[i]);
if(stat(buf, &st))
{
perror("stat");
return -1;
}

//if(res[i][0] != '.')
//display_file(buf, dirent->d_name);
display_file(buf, res[i]);
//printf("%s\n", res[i]);

}
}
}

int main(int argc, char* argv[])
{
struct stat st;
char buf[1024];
if (argc == 1){
do_ls(".");
return 0;
}

if(stat(argv[1], &st) < 0)
{
// do_ls(".");
perror("stat");
return 0;
}

if((st.st_mode & S_IFMT) == S_IFDIR)
do_ls(argv[1]);
else
display_file(argv[1], argv[1]);

//if(argc > 1){
//    int i=1;
//    for(i=1; i<argc; ++i)
//       do_ls(argv[i]);
// }
// else do_ls(".");
return 0;
}


To be continue….
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ubuntu ls命令