实现ls
一、任务详情
参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接
- 打开目录文件
- 针对目录文件
- 读取目录条目
- 显示文件名
- 关闭文件目录文件
二、伪代码
opendir
while(readdir)
print d_name
closedir;
三、ls命令
ls:显示文件目录列表
-a:显示所有的文件,包括隐藏文件
-l:列出长数据串,显示出文件的属性与权限等数据信息(常用)
-i:结合-l参数列出每个文件的inode
-d:仅列出目录本身,而不是列出目录里的内容列表
四、代码
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include <string.h>
#define LS_NONE 0
#define LS_L 101
#define LS_R 102
#define LS_D 103
#define LS_I 104
#define LS_A 200
#define LS_AL (LS_A+LS_L)
#define LS_AI (LS_A+LS_I)
// 展示单个文件的详细信息
void show_file_info(char* filename, struct stat* info_p)
{
char* uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters();
char modestr[11];
mode_to_letters(info_p->st_mode, modestr);
printf("%s", modestr);
printf(" %4d", (int) info_p->st_nlink);
printf(" %-8s", uid_to_name(info_p->st_uid));
printf(" %-8s", gid_to_name(info_p->st_gid));
printf(" %8ld", (long) info_p->st_size);
printf(" %.12s", 4 + ctime(&info_p->st_mtime));
printf(" %s\n", filename);
}
void mode_to_letters(int mode, char str[])
{
strcpy(str, "----------");
if (S_ISDIR(mode))
{
str[0] = 'd';
}
if (S_ISCHR(mode))
{
str[0] = 'c';
}
if (S_ISBLK(mode))
{
str[0] = 'b';
}
if ((mode & S_IRUSR))
{
str[1] = 'r';
}
if ((mode & S_IWUSR))
{
str[2] = 'w';
}
if ((mode & S_IXUSR))
{
str[3] = 'x';
}
if ((mode & S_IRGRP))
{
str[4] = 'r';
}
if ((mode & S_IWGRP))
{
str[5] = 'w';
}
if ((mode & S_IXGRP))
{
str[6] = 'x';
}
if ((mode & S_IROTH))
{
str[7] = 'r';
}
if ((mode & S_IWOTH))
{
str[8] = 'w';
}
if ((mode & S_IXOTH))
{
str[9] = 'x';
}
}
char* uid_to_name(uid_t uid)
{
struct passwd* getpwuid(),* pw_ptr;
static char numstr[10];
if((pw_ptr = getpwuid(uid)) == NULL)
{
sprintf(numstr,"%d",uid);
return numstr;
}
else
{
return pw_ptr->pw_name;
}
}
char* gid_to_name(gid_t gid)
{
struct group* getgrgid(),* grp_ptr;
static char numstr[10];
if(( grp_ptr = getgrgid(gid)) == NULL)
{
sprintf(numstr,"%d",gid);
return numstr;
}
else
{
return grp_ptr->gr_name;
}
}
void do_ls(char dirname[],int mode)
{
DIR* dir_ptr;
struct dirent* direntp;
if ((dir_ptr = opendir(dirname)) == NULL)
{
fprintf(stderr, "ls2: cannot open %s \n", dirname);
}
else
{
if(mode==LS_D)
{
printf("%s\n", dirname);
}
else
{
char dirs[20][100];
int dir_count = 0;
while ((direntp = readdir(dir_ptr)) != NULL)
{
if(mode < 200 && direntp->d_name[0]=='.')
{
continue;
}
char complete_d_name[200]; // 文件的完整路径
strcpy (complete_d_name,dirname);
strcat (complete_d_name,"/");
strcat (complete_d_name,direntp->d_name);
struct stat info;
if (stat(complete_d_name, &info) == -1)
{
perror(complete_d_name);
}
else
{
if(mode == LS_L||mode == LS_AL)
{
show_file_info(direntp->d_name, &info);
}
else if(mode == LS_A||mode == LS_NONE||mode == LS_I||mode == LS_AI)
{
if(mode == LS_I||mode == LS_AI)
{
printf("%llu ", direntp->d_ino);
}
printf("%s\n", direntp->d_name);
}
else if(mode == LS_R)
{
if(S_ISDIR(info.st_mode))
{
printf("%s\n", direntp->d_name);
strcpy (dirs[dir_count],complete_d_name);
dir_count++;
}
else
{
printf("%s\n", direntp->d_name);
}
}
}
}
if(mode == LS_R)
{
int i=0;
printf("\n");
for(;i<dir_count;i++){
printf("%s:\n", dirs[i]);
do_ls(dirs[i],LS_R);
printf("\n");
}
}
}
closedir(dir_ptr);
}
}
// 解析一个单词参数,如-l,-i
int analyzeParam(char* input){
if(strlen(input)==2)
{
if(input[1]=='l') return LS_L;
if(input[1]=='a') return LS_A;
if(input[1]=='d') return LS_D;
if(input[1]=='R') return LS_R;
if(input[1]=='i') return LS_I;
}
else if(strlen(input)==3)
{
if(input[1]=='a'&& input[2]=='l') return LS_AL;
if(input[1]=='a'&& input[2]=='i') return LS_AI;
}
return -1;
}
int main(int ac,char* av[])
{
if(ac == 1)
{
do_ls(".",LS_NONE);
}
else
{
int mode = LS_NONE; // 默认为无参数ls
int have_file_param = 0; // 是否有输入文件参数
while(ac>1)
{
ac--;
av++;
int calMode = analyzeParam(*av);
if(calMode!=-1)
{
mode+=calMode;
}
else
{
have_file_param = 1;
do
{
printf("%s:\n", *av);
do_ls(*av,mode);
printf("\n");
ac--;
av++;
}while(ac>=1);
}
}
if (!have_file_param)
{
do_ls(".",mode);
}
}
}
五、运行结果

实现ls的更多相关文章
- ls: 无法访问/usr/sbin/smartctl: 没有那个文件或目录
环境:RHEL6.5 + Oracle 11.2.0.4 RAC 在安装RAC时,检查时缺少包 cvuqdisk-1.0.9-1,oracle提供脚本修复安装. 但在执行时报错: [root@orad ...
- 用C++实现Linux中shell的ls功能
实现输出当前目录下的文件名 ls功能: 方法一: #include <iostream> #include <algorithm> #include <stdio.h&g ...
- ls目录内容
ls:列出目录内容 1.常用参数: -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件(常用) -A 同-a,但不列出“.”(表示当前目录)和“..”(表示当前目录的父目录). -c ...
- Linux ls
linux.ls linux ls命令, 我觉得是所有接触linux系统, 首先学习的命令. 这个命令, 我也早就接触过了. 只是以前是学习类型的. 学了以后, 没有做到学以致用.可惜了. 现在这篇内 ...
- ls /usr/linkapp 没反应
ls /usr/linkapp ll /usr/linkapp 都是一样无反应 没有任何反应, ctrl + c / ctrl + d 都不行 但是 ls /usr/linkapp/ | wc - ...
- linux命令:ls
命令格式: ls [OPTION]... [FILE]... 功能: 列出某个目录下的文件信息,默认列出当前目录.输出结果默认按字母顺序排列. 参数: -a, --all,-A, --almost-a ...
- 每天一个linux命令(1):ls命令
1. 命令格式: ls [选项] [目录名] 2. 命令功能: 列出目标目录中所有的子目录和文件. 4. 常用范例: 例一:列出/home/peidachang文件夹下的所有文件和目录的详细资料 命令 ...
- linux中ls命令
ls跟dos下的dir命令是一样的都是用来列出目录下的文件 ls参数: -a: ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的, ...
- Linux_用户级_常用命令(1):ls
开篇语:懒是人类进步的源动力 本文原创,专为光荣之路公众号所有,欢迎转发,但转发请务必写出处! Linux常用命令第1集包含命令:ls 一.何为常用命令 人和系统交互的指令集合,构成了shell.Sh ...
- linux-命令-ls
一.命令介绍: ls命令是linux常用的命令之一.ls用来打印当前目录的文件清单或指定目录的文件清单,也可以查看到文件的基本权限和隐藏文件. 二.命令格式: ls [OPTION]... [FILE ...
随机推荐
- DUBBO 面试灵魂18问
一.Dubbo 是什么 dubbo 是一个分布式框架,是一个远程服务调用的分布式框架,其核心部分包含: 1)集群容错: 提供基于接口方法的透明远程过程调用,包含多协议支持,以及软负债均衡.失败容错.地 ...
- elasticsearch 创建索引
一.基本概念 索引:含有相同属性的文档的集合. //可以想象成一个数据库 database 类型:索引可以定义一个或多个类型,文档必须属于一个类型. //可以想象成数据库中的表 table 文档:文档 ...
- koa进阶史(二)
之前想着放弃CAS的验证吧,但是又去请教了一个大牛,了解到sf公司的CAS验证校验的参数不是sessionId而是另外两个,后登陆sit环境偷了两个参数后,后台接口成功返回200.然后node层也就能 ...
- 转:标签中的href如何调用js
在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动 ...
- html5 cavans的小应用
1.canvas鼠标画线,canvas小方块移动,canvas小方块旋转并缩放 <!doctype html> <html> <head> <meta cha ...
- 将xml处理为json对象数组
function xmlStr2js(xmlStr) { var tagNames = xmlStr.match(/<\w+>/g) tagNames = deWeightTagNames ...
- 2019-2020-2 20174313张博 《网络对抗技术》Exp1 PC平台逆向破解
写在前面 ·实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码片段——g ...
- Vulnhub 靶场 Dijnn WP
About djinn: 1 描述 难度级别:中等 Flag:user.txt和root.txt 说明:该计算机是VirtualBox以及VMWare兼容的.DHCP将自动分配IP.您将在登录屏幕上看 ...
- Linux vi编辑的常用的操作备忘
1 复制 1) 单行复制 在命令模式下,将光标移动到将要复制的行处,按"yy"进行复制: 2) 多行复制 在命令模式下,将光标移动到将要复制的首行处,按"nyy" ...
- WSL下卸载了zsh / fish后无法启动bash解决方案
最近在鼓捣wsl,感觉自己用还是蛮好用的.听说1903要更新新的cmd,还蛮期待的 解决步骤: 建议先下载个everything , windows下非常好用的文件查找软件. 启动后搜索.bashrc ...