原理

在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. Prometheus + Grafana 监控(mysql 和redis)

    1.监控MySQL(mysqld-exporter) https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/m ...

  2. 03 flask源码剖析之threading.local和高级

    03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...

  3. 爬虫04 /asyncio、selenium规避检测、动作链、无头浏览器

    爬虫04 /asyncio.selenium规避检测.动作链.无头浏览器 目录 爬虫04 /asyncio.selenium规避检测.动作链.无头浏览器 1. 协程asyncio 2. aiohttp ...

  4. AcWing 1208. 翻硬币

    AcWing 1208. 翻硬币 原题链接 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能 ...

  5. Nginx to start, restart, shutdown and upgrade

    1.start cd usr/local/nginx/sbin ./nginx 2.restart kill -HUP PID #主进程号或进程号文件路径 #或者使用 cd /usr/local/ng ...

  6. css 浮动 定位

    浮动 元素的浮动是指设置了浮动属性的元素会脱离标准普通 流的控制,移动到其父元素中指定位置的过程.  语法: float   . left    . right . none(默认) 注意:    1 ...

  7. ResNeXt论文阅读笔记.md

    目录 1. 提出背景 2. 核心思想 3. 论文核心 4. 分组卷积 5. 核心代码 论文: Aggregated Residual Transformations for Deep Neural N ...

  8. springboot整合Druid(德鲁伊)配置多数据源数据库连接池

    pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  9. 软件测试面试题,十年HR面试经验分享

    WeChat[代码小姐],快和我们一起进大厂,挑战高薪吧. 问:你在测试中发现了一个  bug ,但是开发经理认为这不是一个  bug ,你应该怎样解决. 1.将问题提交到缺陷管理库里面进行备案.2. ...

  10. Kafka 入门(一)--安装配置和 kafka-python 调用

    一.Kafka 简介 1.基本概念 Kafka 是一个分布式的基于发布/订阅消息系统,主要应用于大数据实时处理领域,其官网是:http://kafka.apache.org/.Kafka 是一个分布式 ...