实现Linux下的ls和ls-l
ls的C语言代码实现
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <dirent.h> #include <string.h> #include <linux/limits.h> #include <pwd.h> #include <grp.h> #include <time.h> #define PARAM_NONE 0 //无参数 #define PARAM_A 1 //-a #define PARAM_L 2 //-l #define MAXROWLEN 80 //一行最多显示的字符数 int g_leave_len = MAXROWLEN; //一行是剩余长度,用于输出对齐 int g_maxlen; //存放某目录下最长文件名的长度 void my_error(const char* errstring, int line) { fprintf(stderr,"line:%d",line); perror(errstring); exit(); } //打印单个文件,且没有-l参数 void display_single(char *name) { int i,len; //如果本行不足以打印一个文件名则换行 if(g_leave_len < g_maxlen) { printf("\n"); g_leave_len = MAXROWLEN; } len = strlen(name); len = g_maxlen - len; printf("%-s",name); ;i<len;i++) { printf(" "); } printf(" "); g_leave_len = g_leave_len - g_maxlen - ; } /*获取文件属性并打印*/ void display_attribute(struct stat buf, char *name) { ]; struct passwd *psd; struct group *grp; //获取文件类型 if(S_ISLNK(buf.st_mode)) printf("); else if(S_ISREG(buf.st_mode)) printf("-"); else if(S_ISDIR(buf.st_mode)) printf("d"); else if(S_ISCHR(buf.st_mode)) printf("c"); else if(S_ISBLK(buf.st_mode)) printf("b"); else if(S_ISFIFO(buf.st_mode)) printf("f"); else if(S_ISSOCK(buf.st_mode)) printf("s"); //获取文件权限 if(buf.st_mode & S_IRUSR) printf("r"); else printf("-"); if(buf.st_mode & S_IWUSR) printf("w"); else printf("-"); if(buf.st_mode & S_IXUSR) printf("x"); else printf("-"); if(buf.st_mode & S_IRGRP) printf("r"); else printf("-"); if(buf.st_mode & S_IWGRP) printf("w"); else printf("-"); if(buf.st_mode & S_IXGRP) printf("x"); else printf("-"); if(buf.st_mode & S_IROTH) printf("r"); else printf("-"); if(buf.st_mode & S_IWOTH) printf("w"); else printf("-"); if(buf.st_mode & S_IXOTH) printf("x"); else printf("-"); printf(" "); //根据uid和gid获取文件所有者的用户名于组名 psd = getpwuid(buf.st_uid); grp = getgrgid(buf.st_gid); printf("%4d",buf.st_nlink); printf("%-8s",psd->pw_name); printf("%-9s",grp->gr_name); printf("%6d",buf.st_size); strcpy(buf_time, ctime(&buf.st_mtime));//将格林位置时间转化成正常时间格式 buf_time[strlen(buf_time) - ] = ; printf(" %s",buf_time); } //根据flag参数显示文件内容,调用display_single或者display_attribute void display(int flag,char *pathname) { int i,j; struct stat buf; ]; ,j=;i<strlen(pathname);i++) { if(pathname[i] == '/') { j = ; } else name[j++] = pathname[i]; } name[j] = ; ) { my_error("stat",__LINE__); } if(flag == PARAM_NONE) { ] != '.')//不显示隐藏文件 { display_single(name); } } else if(flag == PARAM_A) { display_single(name); } else if(flag == PARAM_L) { ] != '.') { display_attribute(buf,name); printf(" %-s\n",name); } } else if(flag == (PARAM_A | PARAM_L)) { display_attribute(buf,name); printf(" %-s\n",name); } } void display_dir(int flag_param,const char *path) { DIR* dir; struct dirent* dirent; ][PATH_MAX+],temp[PATH_MAX+]; ;//总共有多少个文件 if((dir = opendir(path)) == NULL) { my_error("opendir",__LINE__); } //获取文件总数和最长文件名 while((dirent = readdir(dir)) != NULL) { if(g_maxlen < strlen(dirent->d_name)) g_maxlen = strlen(dirent->d_name); count++; } closedir(dir); ) my_error("文件太多超过了256个",__LINE__); int i,j,len = strlen(path); //获取目录下所有的文件名 dir = opendir(path); ;i<count;i++) { dirent = readdir(dir); if(dirent == NULL) { my_error("readdir",__LINE__); } strncpy(filenames[i],path,len); filenames[i][len] = ; strcat(filenames[i],dirent->d_name); filenames[i][len+strlen(dirent->d_name)] = ; } //对文件名进行排序 ;i<count-;i++) ;j<count-;j++) { ) { strcpy(temp,filenames[j]); strcpy(filenames[j] , filenames[i]); strcpy(filenames[i] , temp); } } ;i<count;i++) display(flag_param,filenames[i]); closedir(dir); //没有-l的话打印一个换行符 ) printf("\n"); } int main(int argc, char **argv) { int i,j,k; int num;//记录-的个数 ]; ]; // 保存命令行参数 int flag_param = PARAM_NONE; struct stat buf; j = ; num = ; ;i<argc;i++) { ] == '-') { ;k<strlen(argv[i]);k++) { param[j] = argv[i][k]; j++; } num++; } } //现在只支持-a和-l参数 ;i<j;i++) { if(param[i] == 'a') { flag_param |= PARAM_A; } else if(param[i] == 'l') { flag_param |= PARAM_L; } else { printf("错误的参数:%c\n",param[i]); exit(); } } param[j] = ; //如果没有输入文件名或者目录,就显示当前目录 ) == argc) { strcpy(path,"./"); path[] = ; display_dir(flag_param,path); ; } i = ; ;i<argc;i++) { ] != '-') { strcpy(path,argv[i]); ) my_error("stat",__LINE__); if(S_ISDIR(buf.st_mode)) { //判断目录是否以/结尾 ] != '/') { path[strlen(argv[i])] = '/'; path[strlen(argv[i] + )] = ; } else path[strlen(argv[i])] = ; display_dir(flag_param,path); } else { display(flag_param,path); } } } ; }
截图:
实现Linux下的ls和ls-l的更多相关文章
- Linux下ll命令与ls -l
还大三Linux课的债. 1.ll命令用于显示当前文件下非隐藏文件的详情 查询结果分为7栏: 1)如' -rw-r--r--' 表示三种用户对该文件的不同权限: r:可读:w:可写:x:可执行 其中第 ...
- linux 下用 c 实现 ls -l 命令
#include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <sys/sta ...
- linux下 解释 终端命令 ls -al或者ls -li 输出的信息
$ ls -al drwxr-xr-x. wjshan0808 wjshan0808 Sep : .cache $ ls -li ...
- linux下用c实现ls命令
struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 #include < ...
- Linux 下的基本命令
Linux 下的基本命令 1. ls 命令 格式 : ls [OPTION]... [FILE]... 用途 : 显示目录下的内容 [OPTION] : -l : 列出详细信息 -d : 显示目录本身 ...
- linux 下ln命令--笔记
linux 下ln命令 ln命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.注意:符号链接文件不是一个独立 ...
- 实现Linux下的ls -l命令
基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...
- linux下出现+ ls --color=auto -l --color=auto...++ echo -ne '\033]0;root@imon-2:~'等
[root@imon-2 ~]# cd /root/ + cd /root/ ++ echo -ne '\033]0;root@imon-2:~' [root@imon-2 ~]# ll + ls - ...
- linux下ls -l命令(即ll命令)查看文件的显示结果分析
在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...
- 控制台程序的中文输出乱码问题(export LC_CTYPE=zh_CN.GBK,或者修改/etc/sysconfig/i18n为zh_CN.GBK。使用setlocale(LC_CTYPE, "");会使用默认办法。编译器会将源码做转换成Unicode格式,或者指定gcc的输入文件的编码参数-finput-charset=GBK。Linux下应该用wprintf(L"%ls/n",wstr))
今天发现用securecrt登陆时,gcc编译出错时会出现乱码,但直接在主机的窗口界面下用Shell编译却没有乱码.查看了一下当时的错误描述,发现它的引号是中文引号,导致在SecureCRT中显示出错 ...
随机推荐
- phpStorm中如何不让其自动添加封闭大括号?
Settings > Editor > General->Smart Keys.
- c# mvc 封装返回对象
将所有返回JsonContent对象进行再次封装 public class ResultFilterAttribute : System.Web.Mvc.ActionFilterAttribute { ...
- 朗科32G TF卡的读写测试
卡是这样的, 下面是实际测试的结果. 容量测试 SKS的USB2外置读卡器, X240内置读卡器加上SD卡套 UNITEK的USB3.0读卡器, 经过UNITEK的USB3.0 HUB 看来读4 ...
- m3u8转码
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_list_size 0 -hls_time 5 output.m3u8
- spring boot 搭建
http://www.ityouknow.com/springboot/2018/06/12/spring-boo-java-simple.html 在http://start.spring.io/下 ...
- Linux安装NET CORE
Linux安装.NET CORE 1.Add the dotnet apt-get feed 为了在Ubuntu或Linux Mint上安装.NET,您需要首先设置托管所需软件包的apt-get fe ...
- H+ 显示并激活menuTab 根据tabName
//注:在contabs.js文件中 $(function () { }); 方法外 加入//注: data-name="' + menuName + '" 这句是加入的自定义属性 ...
- c语言搜索子字符串
c字符串功能练习: 获取一行字符串,然后,在这行字符串中搜索是否包含一个小字符串 #include <cstdio> #include <cstring> #define N ...
- 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验
----本节内容------- 1.Kafka基础概念 1.1 出世背景 1.2 基本原理 1.2.1.前置知识 1.2.2.架构和原理 1.2.3.基本概念 1.2.4.kafka特点 2.Kafk ...
- Docker安装和使用(转)
(转)原文地址:https://www.cnblogs.com/xiewenming/p/7903247.html 一,安装Docker 1.1 安装之前保持一个干净的Docker环境 sudo yu ...