原理

在linux下使用C语言,通过调用Linux系统的目录访问API来实现一个类似于ls命令功能的小程序,主要是可以练习程序对命令的解析和目录API函数的使用。

实现代码

#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h> int aflag = 0,lflag = 0; void display_file(char *fname , char *nname)
{
struct stat buf;
struct tm *t;
int i; if(stat(fname,&buf) < 0)
{
perror("stat error\n");
return ;
} switch(buf.st_mode & S_IFMT)
{
case S_IFSOCK: printf("s"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFBLK: printf("b"); break;
case S_IFDIR: printf("d"); break;
case S_IFCHR: printf("c"); break;
case S_IFIFO: printf("p"); break;
} for(i = 8 ; i >= 0 ; i--)
{
if(buf.st_mode & (1 << i))
{
if(i % 3 == 2) printf("r");
if(i % 3 == 1) printf("w");
if(i % 3 == 0) printf("x");
}
else
printf("-");
} printf(" %d ",buf.st_nlink); printf("%s ",getpwuid(buf.st_uid)->pw_name);
printf("%s ",getgrgid(buf.st_gid)->gr_name); printf("%ld ",buf.st_size); t = localtime(&buf.st_mtime);
printf("%d-%02d-%02d %02d:%02d ",t->tm_year+1900,t->tm_mon+1,t->tm_mday,
t->tm_hour,t->tm_min);
printf("%s\n",nname); return ;
} void display_dir(char *dir)
{
DIR *mydir;
struct dirent *myitem;
char fname[256]; if((mydir = opendir(dir)) == NULL)
{
perror("fail to opendir!\n");
return ;
}
while((myitem = readdir(mydir)) != NULL)
{
if(myitem->d_name[0] == '.' &&
!aflag)//如果if条件成立的就继续下一次循环,否则往下执行
continue; if(lflag)//ls -l -a dir
{ sprintf(fname,"%s/%s",dir,myitem->d_name);
display_file(fname,myitem->d_name);
}
else // ls dir
printf("%s ",myitem->d_name);
}
printf("\n");
closedir(mydir);
return ;
} int main(int argc,char *argv[])
{
int ch,i;
struct stat buf; opterr = 0;
//解析命令
while((ch = getopt(argc,argv,"la")) != -1)
{
switch(ch)
{
case 'a': aflag = 1; break;
case 'l': lflag = 1; break;
default: printf("wrong option:%c\n",optopt);return -1;
}
} if(optind == argc)//no argument //ls .没有带参直接ls当前目录
display_dir("."); for(i = optind; i < argc ; i++) //ls name1 name2....
{
if(stat(argv[i],&buf) < 0)
{
perror("fail to stat!\n");
return -1;
}
if(S_ISDIR(buf.st_mode))//dir
{
printf("%s:\n",argv[i]);
display_dir(argv[i]);
}
else//file
if(lflag)//ls -l file
display_file(argv[i],argv[i]);
else// ls file
printf("%s",argv[i]);
printf("\n");
} return 0;
}

编译

gcc test.c -o test

运行

直接运行,输出当前目录的文件:

./test
test test.c

跟个参数,输出详细信息:

./test -l
-rwxrwxr-x 1 root root 13637 2020-04-15 07:37 test
-rw-r--r-- 1 root root 2409 2014-03-25 06:01 test.c

输出隐藏文件:

./test -a
test .test.c.bak test.c .. .

Linux用C语言模拟‘ls‘命令的更多相关文章

  1. Linux学习历程——Centos 7 ls命令

    一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...

  2. Linux文件与目录操作 ls 命令(2)

    说文件操作是最频繁地操作也不为过,在Linux中,使用ls命令可以列出当前目录中所有内容,本篇就先说说ls命令.本文所说的文件指文件和目录. ls命令常用选项 -a:显示指定目录下所有子目录与文件,包 ...

  3. Linux下C语言执行shell命令

    有时候在代码中需要使用到shell命令的情况,下面就介绍一下怎么在C语言中调用shell命令: 这里使用popen来实现,关于popen的介绍,查看 http://man7.org/linux/man ...

  4. linux 学习之路:ls命令使用

    1.命令格式: Ls 显示指定工作目录下的目录内容 语法:ls [-alrtAFR] [name...] 2.命令参数: 3.命令功能: 显示列出目前工作目录所含之文件及子目录 4.命令范例: 列出根 ...

  5. linux下用c实现ls命令

    struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 #include < ...

  6. linux ls命令按时间显示文件

      本文介绍下,使用ls命令显示文件,并按时间排序的方法,供大家学习参考. 在linux系统中,使用ls命令按时间排序文件,其实很简单,如下: #ls -tr 即可按时间排序当前目录下的文件. 附,l ...

  7. ls命令的20个实用范例

    contents ls -l -h -lhS -l --block-size=M -a -d */ -g -G -n --color=never -i -p -r -R -t ls ~ ls --ve ...

  8. 【转】ls 命令的 20 个实用范例

    Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...

  9. ls 命令还能这么玩?看一下这 20 个实用范例

    Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...

随机推荐

  1. php 修改图片大小

    <?php set_time_limit(0);ini_set("memory_limit","500M");$dir = dir('./');while ...

  2. 深入Vue-router最佳实践

    前言 最近再刷Vue周边生态的官方文档,因为之前的学习都是看视频配合着文档,但主要还是通过视频学习,所以很多知识点都没有了解,至从上次刷了Vuex的官方文档就体会到了通读文档的好处,学习一门技术最好的 ...

  3. element-ui 表单校验 Rules 配置 常用黑科技

    type 指示type要使用的验证器.可识别的类型值为: string:类型必须为string.type 默认是 string // 校验 string: [ {type: 'string', mes ...

  4. 2-ADC

  5. mongodb(五):聚合操作(python)

    pymongo的聚合操作 数据类型样式 /* 1 */ { "_id" : ObjectId("5e5a32fe2a89d7c2fc05b9fc"), &quo ...

  6. 团队转型,Scrum与DevOps要如何取舍?

    团队在践行敏捷的过程中,会有多种选择:Scrum.XP.Kanban.Crystal.精益生产.规模化敏捷等,其中最流行的敏捷开发方法当属Scrum.正因如此,大部分人对其产生了刻板印象:认为敏捷就是 ...

  7. nginx的基础学习+实战

    文章目录 一.前言 二.反向代理 三.负载均衡 四.动静分离 参考视频:尚硅谷Nginx教程(2019发布) 参考链接:Windows下Nginx负载均衡实现 一.前言 Nginx (engine x ...

  8. 设计模式:decorator模式

    两点: 继承同一虚接口,实现数据一致性 桥接方式指向被装饰类 目的:在不改变被装饰类功能的前提下增加新功能 特点:继承是子类和父类强耦合,桥接是低耦合 例子: class Print //抽象接口 { ...

  9. DPDK之什么是imissed、ierrors、rx_nombuf

    DPDK之什么是imissed.ierrors.rx_nombuf 在采用DPDK进行网络抓包时常常会通过rte_eth_stats_get函数获取当前网卡的丢包状态,首先看一下该函数的声明: // ...

  10. git上传本地项目到gitlab

    <1>输入git config --global user.name "你的用户名" <2>输入git config --global user.email ...