原理

在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. Halcon一维测量1D Measuring解析

    一维测量(也叫一维计量或卡尺)的概念非常直观.沿着一个预定的区域(主要是垂直于RIO感兴趣区域的方向) 边缘的位置.这里的边缘为从暗到亮或从亮到暗的过渡. 基于提取的边缘,可以测量零件的尺寸.例如,可 ...

  2. python面试题三:Python 网络编程与并发

    1 简述 OSI 七层协议. OSI七层协议模型主要是: 应用层(Application):为用户的应用程序(例如电子邮件.文件传输和终端仿真)提供网络服务. 表示层(Presentation):使用 ...

  3. scrapy 基础组件专题(八):scrapy-redis 框架分析

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  4. web 部署专题(七):Ubuntu + Nginx + Flask + Gunicore环境搭建(服务器)

    现在我们手里有一个准备发布的项目,那么如何将他上传到你的服务器,并让外网访问呢? 安装: 安装Flask pip3 install flask 安装UWSGI pip3 install uwsgi 安 ...

  5. 1.对Java平台的理解。“Java是解释执行”对吗

    Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”,能够非常容易地获得跨平台能力: 另外就是垃圾收集(GC),Java通过垃圾收集器(Garbage Colle ...

  6. 查看进程中占cpu高的线程方法

    当在任务管理器中发现有进程占用cpu过高的时候通过下面的指令将进程快照导出到c盘 jstack -l 进程PID > c:/进程PID.stack  (此命令生成.stack文件在c盘中,用文本 ...

  7. 足球动图gif(二)

  8. java opencsv解析csv文件

    记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...

  9. 一文说通C#中的异步编程

    天天写,不一定就明白. 又及,前两天看了一个关于同步方法中调用异步方法的文章,里面有些概念不太正确,所以整理了这个文章.   一.同步和异步. 先说同步. 同步概念大家都很熟悉.在异步概念出来之前,我 ...

  10. Netty 学习笔记(2) ------ 数据传输载体ByteBuf

    Netty中读写以ByteBuf为载体进行交互 ByteBuf的结构 ByteBuf以readerIndex和writerIndex划分为三块区域,废弃字节,可读字节,可写字节.每次从ByteBuf读 ...