C语言实现Linux系统下ls命令的过滤文件功能
C语言实现Linux系统下ls命令的过滤文件功能1、首先先介绍一下ls命令: ls命令在linux中的功能是查看文件或目录的信息由于ls命令后面接的可变参数过多,这里只介绍其中常用的几种,其他的用法可使用man命令查看用户手册 查看手册: man lsLinux系统中ls命令的基本用法: ls :列出当前目录中的所有文
C语言实现Linux系统下ls命令的过滤文件功能
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); //关闭目录
方法一:
采用字符串比较,从文件名的末尾开始遍历文件名这个字符串,若比较的后缀与我们要查找的后缀一致,即输出文件名。
- #include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
/*
函数名称:my_strlen
函数功能:计算字符串长度
参数:char *str --字符串
返回值:int--字符串长度
*/
int my_strlen(char *str)
{
int cnt=0;
while((*str++)!='\0')
cnt++;
return cnt;
}
/*
函数名称:main
函数功能:主函数
参数:int argc--输入字符串个数 char **argv--字符串
返回值:int
*/
int main(int argc,char **argv) - {
int flag=0; - struct dirent *file_name;
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 len1=my_strlen(argv[2]);//获取要查找的文件后缀长度
int i=0,len2=0;
//遍历目录中所有文件
while(file_name=readdir(dir))
{
len2=my_strlen(file_name->d_name);//获取文件名的长度
len2-=1;
for(i=len1-1;i>=0;i--)
{
if((*(*(argv+2)+i))==(file_name->d_name[len2--]))//判断文件的后缀与输入的是否相同
flag++;
}
if(flag==len1)
printf("%s\n",file_name->d_name);
flag=0;
}
//关闭目录
closedir(dir);
return 0;
}
方法二:
利用库函数strstr找到文件名中是否有与要过滤的后缀相同的字符串,并同时判断文件名中与后缀相同的字符串的下一个字符是否为0(做这一步的目的是为了防止文件名中间有相同后缀,如:123.c456.c)strstr函数功能: 在字符串(s1)中查找与字符串(s2)相同的子串,\$查找成功,返回在字符串(s1)中从这 个子串开始的所有字符。
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
/*
函数名称: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;
}
更多推荐
所有评论(0)