Linux用C语言模拟‘ls‘命令
原理
在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‘命令的更多相关文章
- Linux学习历程——Centos 7 ls命令
一.命令介绍 ls命令用于显示目录中的信息. ----------------------------------------------------------------------------- ...
- Linux文件与目录操作 ls 命令(2)
说文件操作是最频繁地操作也不为过,在Linux中,使用ls命令可以列出当前目录中所有内容,本篇就先说说ls命令.本文所说的文件指文件和目录. ls命令常用选项 -a:显示指定目录下所有子目录与文件,包 ...
- Linux下C语言执行shell命令
有时候在代码中需要使用到shell命令的情况,下面就介绍一下怎么在C语言中调用shell命令: 这里使用popen来实现,关于popen的介绍,查看 http://man7.org/linux/man ...
- linux 学习之路:ls命令使用
1.命令格式: Ls 显示指定工作目录下的目录内容 语法:ls [-alrtAFR] [name...] 2.命令参数: 3.命令功能: 显示列出目前工作目录所含之文件及子目录 4.命令范例: 列出根 ...
- linux下用c实现ls命令
struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 #include < ...
- linux ls命令按时间显示文件
本文介绍下,使用ls命令显示文件,并按时间排序的方法,供大家学习参考. 在linux系统中,使用ls命令按时间排序文件,其实很简单,如下: #ls -tr 即可按时间排序当前目录下的文件. 附,l ...
- 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 ...
- 【转】ls 命令的 20 个实用范例
Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...
- ls 命令还能这么玩?看一下这 20 个实用范例
Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...
随机推荐
- Scala 面向对象(十一):特质(接口) 四
1 扩展类的特质 特质可以继承类,以用来拓展该类的一些功能 所有混入该特质的类,会自动成为那个特质所继承的超类的子类 如果混入该特质的类,已经继承了另一个类(A类),则要求A类是特质超类的子类,否则就 ...
- java 面向对象(二十二):关键字:final
final:最终的1.可以用来修饰:类.方法.变量 2.具体的: 2.1 final 用来修饰一个类:此类不能被其他类所继承. * 比如:String类.System类.StringBuffer类 * ...
- 蜂鸟E203系列——Linux调试(GDB+Openocd)
欲观原文,请君移步 本文基于文章<蜂鸟E203系列--利用 Hbrid-E-SDK 环境开发程序> GDB 简介 GDB(GNU Project Debugger),是 GNU 工具链中的 ...
- bzoj1528[POI2005]sam-Toy Cars*&&bzoj1826[JSOI2010]缓存交换
bzoj1528[POI2005]sam-Toy Cars bzoj1826[JSOI2010]缓存交换 题意: Jasio有n个不同的玩具,它们都被放在了很高的架子上,地板上不会有超过k个玩具.当J ...
- react实战 : react 与 svg
有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...
- 时间序列知识图谱-《利用Python进行数据分析》
所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片. 其他章 ...
- 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...
- 感知机(perceptron)原理总结
目录 1. 感知机原理 2. 损失函数 3. 优化方法 4. 感知机的原始算法 5. 感知机的对偶算法 6. 从图形中理解感知机的原始算法 7. 感知机算法(PLA)的收敛性 8. 应用场景与缺陷 9 ...
- 怎么理解Python迭代器与生成器?
怎么理解Python迭代器与生成器?在Python中,使用for ... in ... 可以对list.tuple.set和dict数据类型进行迭代,可以把所有数据都过滤出来.如下: ...
- Cordova iPhone 刘海屏 和 安卓瀑布屏 等异形屏幕的适配处理
1. 在cordova项目的config.xml中指定StatusBarOverlaysWebView(需要cordova-plugin-statusbar插件支持),表示应用界面是否覆盖状态栏(系 ...