C语言实现Linux系统下ls命令的过滤文件功能
2018-02-03 16:17
721 查看
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;
}
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;
}
相关文章推荐
- C语言拷贝文件函数实现(linux cp [source file] [target file] 命令的实现)
- linux文件和目录操作(附ls命令实现)
- UNIX环境高级编程学习之第六章系统数据文件和信息-修改第四章实现的Shell的“ls -l”功能
- 在linux中用C语言实现ping命令的部分功能
- 在linux中用C语言实现ping命令的部分功能
- windows与linux系统互相拷贝文件借助PSCP命令实现
- 用C语言实现Linux命令的cat功能
- Linux系统遍历文件夹 获取文件大小的操作(C语言实现)
- linux下用c语言实现ls -l 对文件或者目录的属性遍历
- 【C语言】实现Linux下的cp命令的基本功能
- linux系统调用之文件:递归实现tree命令
- Linux系统编程_1_目录读取(实现简单ls命令)
- 在linux中用C语言实现ping命令的部分功能
- 轻松实现 Linux系统下互联网过滤功能(转)
- linux下c语言实现tail -f功能---实时读取变化文件中的增量内容
- linux下使用系统调用编程实现copy命令功能
- scp:实现网络中Linux系统下文件互相拷贝功能
- Java利用ImageMagick调用linux系统命令实现Ai或者PSD文件转化为jpg或者png文件
- linux whoami cp mv mesg 命令 c语言实现(部分功能)
- *Linux常用命令学习1---(安装、文件系统、目录操作命令cd ls mv cp rm mkdir、链接命令ln……)