C程序myls,实现 ls -l 的功能

1.终端输入:vim myls.c

2.编写代码: 

#include <grp.h>
#include <pwd.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <strings.h>
#include <sys/stat.h>

char *type_perm(mode_t mode);

int main(int argc,char **argv)
{
        if(argc>2){
                perror("输入错误\n");
                exit(0);
        }
        struct stat info;
        bzero(&info,sizeof(info));
        stat(argv[1],&info);

        //获取用户名的结构体与定义
        struct passwd *my_info;
        my_info=getpwuid(getuid());

        //获取用户组名的结构体与定义
        struct group *my_gid;
        my_gid=getgrgid(getgid());

        //char *wday[]={"Sun","Mon","tue","wed","Thu","Fri","Sat"};
        char *wmon[]={"Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec"};

        if(S_ISDIR(info.st_mode)){
                //打开目录:获取目录的访问入口
                DIR *dp=opendir(argv[1]);
                chdir(argv[1]);

                if(dp==NULL){
                        printf("打开目录[%s]失败\n",argv[1]);
                        exit(0);
                }

                //不断地读取目录项
                struct dirent *ep;
                while(1){
                        ep=readdir(dp);//读取目录,得到目录指针
                        if(ep==NULL)//读完了全部目录项
                                break;

                        if(ep->d_name[0]=='.')//跳过隐藏文件
                                continue;

                        bzero(&info,sizeof(info));
                        stat(ep->d_name,&info);

                        //获取时间的结构体与定义
                        time_t timep;
                        struct tm *p;
                        ctime(&info.st_mtim.tv_sec);
                        p=localtime(&info.st_mtim.tv_sec);

                        printf("%s ",type_perm(info.st_mode));//输出文件类型和权限
                        printf("%ld ",info.st_nlink);//输出链向此文件的连接数(硬连接)
                        printf("%s ",my_info->pw_name);//输出文件的所有者
                        printf("%s ",my_gid->gr_name);//输出文件的所在组
                        printf("%8ld ",info.st_size);//定间隔输出文件的大小
                        printf("%s %2d %2d:%2d ",wmon[p->tm_mon],p->tm_mday,p->tm_hour,p->tm_min);//定间隔输出文件最近的修改时间
                        printf("%s\n",ep->d_name);//输出名字
                }
                closedir(dp);
        }

        else{
                //获取时间的结构体与定义
                time_t timep;
                struct tm *p;
                ctime(&info.st_mtim.tv_sec);
                p = localtime(&info.st_mtim.tv_sec);

                //输出文件类型和权限
                printf("%s ", type_perm(info.st_mode));

                // 输出链向此文件的连接数(硬连接)
                printf("%ld ",info.st_nlink);

                // 输出文件的所有者
                printf("%s ",my_info->pw_name);

                // 输出文件的所在组
                printf("%s ",my_gid->gr_name);

                // 定间隔输出文件的大小
                printf("%4ld ", info.st_size);

                // 定间隔输出文件的最近修改时间
                printf("%s %2d %2d:%2d ", wmon[p->tm_mon], p->tm_mday, p->tm_hour, p->tm_min);

                // 输出名字
                printf("%s\n", argv[1]);
        }
        return 0;
}

char *type_perm(mode_t mode)
{
        static char result[11];

        switch(mode & S_IFMT)
        {
                case S_IFBLK: result[0] = 'b'; break;
                case S_IFCHR: result[0] = 'c'; break;
                case S_IFREG: result[0] = '-'; break;
                case S_IFIFO: result[0] = 'p'; break;
                case S_IFSOCK:result[0] = 's'; break;
                case S_IFLNK: result[0] = 'l'; break;
                case S_IFDIR: result[0] = 'd'; break;
        }

        char rwx[] = {'r', 'w', 'x'};
        for(int i=0; i<9; i++)
        {
                result[i+1] = mode&(0400>>i) ? rwx[i%3] : '-';
        }
        return result;
}

                                                   

3.编译:gcc myls.c -o myls

4.运行:./myls .

             或者./myls 目录(比如:./myls /etc)

 

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
myls命令包含9个选项: (1) myls : 在缺省选项的情况下,列出当前文件夹下的普通文件(不包含隐藏文件)。 例如:当前目录包含文件home1.c, home2.c, .home3.c,输入myls后,列出的文件名为home1.c, home2.c. (2) myls –a: 列出当前文件夹下的所有文件(包含隐藏文件)。 例如:当前目录包含文件home1.c、home2.c、.home3.c,输入myls -a后,列出所有的文件名为home1.c, home2.c, .home3.c. (3) myls –l: 列出当前文件夹下普通文件的详细信息,包括文件模式,文件链接数,文件所属用户,文件所属用户组,文件大小,文件最后修改时间,文件名。并且在最后一行显示该目录下所显示的文件文件块数。 例如:显示drwxr-xr-x 3 eli eli 4096 Nov 16 23:07 Desktop (4) myls -R 递归列出文件及其子文件。 例如:当前目录为home, 其中包含文件home1, home2, home3. 其中home1是目录文件,包含文件home11, home12, home2不是目录文件,home3是目录文件,包含文件home31, home32。 输入myls –R后,列出的文件名为 ./home: home1 home2 home3 ./home/home1: home11 home12 ./home/home3: home31 home32. (5) myls –u: 列出当前文件夹下用户x的普通文件,若输入myls -u bb,则显示所属bb的普通文件。 例如:文件home1, home2, home3属于aa,文件tmp1, tmp2, tmp3属于bb, 则若输入myls –u aa, 则显示home1,home2,home3,若输入myls -u bb, 则显示tmp1,tmp2,tmp3。 (6) myls –S: 对文件进行排序,需要输入比较参数。 myls –S 的参数包括: time——按最近修改时间排序 name——按文件名的字典序排序 size——按文件的大小从小到大排序 link——按文件链接数从少到多排序 (7) myls -1: 将当前文件夹下的文件按照一行一个的方式显示。 (8) myls –s: 在各个文件开头显示这个文件文件块大小。 (9) myls /dirname: 显示/dirname下的文件。 编译 gcc main.c -o myls 执行 ./myls 可加若干参数,具体见上描述 程序并不完整,可能会有BUG,希望广大网友指点,交流~

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值