1、首先先介绍一下ls命令:
ls命令在linux中的功能是查看文件或目录的信息
由于ls命令后面接的可变参数过多,这里只介绍其中常用的几种,其他的用法可使用man命令查看用户手册
查看手册: man ls
Linux系统中ls命令的基本用法:
ls :列出当前目录中的所有文件和目录,不包括隐藏文件
ls -l :列出当前目录中所有文件和目录的详细信息,包括文件类型、权限、文件大小、最近修改时间、文件名
ls -a :列出当前目录中所有文件和目录,包括隐藏文件(. 和 ..)
注:在Linux的每个目录中都会有两个隐藏文件. 和 ..
. 代表当前目录 ..代表上一层目录
ls ./* :列出当前目录中所有文件,*代表所有
ls ./*.c :列出当前目录中的所有.c文件
注:上面命令后面都没有加文件路径,代表当前目录,若加上路径,则表示显示路径目录的信息
2、接下来C语言代码实现的功能正是上面的过滤文件功能。
例如: ls ./*.c :列出当前目录所有.c文件
ls ./*.h :列出当前目录所有.h文件
当然不仅限与当前目录,只要路径正确皆可实现
源码:
这里提供两种实现方法
要用到的库函数(库函数是我从linux系统手册中复制过来)
DIR *opendir(const char *name);//打开目录
struct dirent *readdir(DIR *dirp);//读取目录中文件
//在使用readdir命令读取目录中文件时,都会返回下面的结构体中信息,在代码中我们需要用到其中的d_name(文件名)
struct dirent {
ino_t d_ino; /* inode number */
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported
by all file system types */
char d_name[256]; /* filename */
};
int closedir(DIR *dirp); //关闭目录
方法一:
采用字符串比较,从文件名的末尾开始遍历文件名这个字符串,若比较的后缀与我们要查找的后缀一致,即输出文件名。
方法二:
利用库函数strstr找到文件名中是否有与要过滤的后缀相同的字符串,并同时判断文件名中与后缀相同的字符串的下一个字符是否为0(做这一步的目的是为了防止文件名中间有相同后缀,如:123.c456.c)strstr函数功能: 在字符串(s1)中查找与字符串(s2)相同的子串,\$查找成功,返回在字符串(s1)中从这 个子串开始的所有字符。
#include
#include
#include
#include
/*
函数名称:main
函数功能:主函数
参数:int argc--输入字符串个数 char **argv--字符串
返回值:int
*/
int main(int argc,char **argv)
{
struct dirent *file_info;
if(argc!=3)
{
printf("传参格式:./a.out <目录名称> <查找类型>\n");
return 0;
}
//打开目录
DIR *dir=opendir(argv[1]);
if(dir==NULL)
{
printf("%s目录打开失败!\n",argv[1]);
return 0;
}
int len=strlen(argv[2]);
char *find_str=NULL;
//遍历目录
while(file_info=readdir(dir))
{
if( find_str=strstr(file_info->d_name,argv[2]) )
{
find_str+=len; //将指针定位到查找到的字符串的最后的下一个
if(*(find_str)==0)
printf("%s\n",file_info->d_name);
}
}
closedir(dir);
return 0;
}