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命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...
随机推荐
- Prometheus + Grafana 监控(mysql 和redis)
1.监控MySQL(mysqld-exporter) https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/m ...
- 03 flask源码剖析之threading.local和高级
03 threading.local和高级 目录 03 threading.local和高级 1.python之threading.local 2. 线程唯一标识 3. 自定义threading.lo ...
- 爬虫04 /asyncio、selenium规避检测、动作链、无头浏览器
爬虫04 /asyncio.selenium规避检测.动作链.无头浏览器 目录 爬虫04 /asyncio.selenium规避检测.动作链.无头浏览器 1. 协程asyncio 2. aiohttp ...
- AcWing 1208. 翻硬币
AcWing 1208. 翻硬币 原题链接 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能 ...
- Nginx to start, restart, shutdown and upgrade
1.start cd usr/local/nginx/sbin ./nginx 2.restart kill -HUP PID #主进程号或进程号文件路径 #或者使用 cd /usr/local/ng ...
- css 浮动 定位
浮动 元素的浮动是指设置了浮动属性的元素会脱离标准普通 流的控制,移动到其父元素中指定位置的过程. 语法: float . left . right . none(默认) 注意: 1 ...
- ResNeXt论文阅读笔记.md
目录 1. 提出背景 2. 核心思想 3. 论文核心 4. 分组卷积 5. 核心代码 论文: Aggregated Residual Transformations for Deep Neural N ...
- springboot整合Druid(德鲁伊)配置多数据源数据库连接池
pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...
- 软件测试面试题,十年HR面试经验分享
WeChat[代码小姐],快和我们一起进大厂,挑战高薪吧. 问:你在测试中发现了一个 bug ,但是开发经理认为这不是一个 bug ,你应该怎样解决. 1.将问题提交到缺陷管理库里面进行备案.2. ...
- Kafka 入门(一)--安装配置和 kafka-python 调用
一.Kafka 简介 1.基本概念 Kafka 是一个分布式的基于发布/订阅消息系统,主要应用于大数据实时处理领域,其官网是:http://kafka.apache.org/.Kafka 是一个分布式 ...