您的位置:首页 > 运维架构 > Linux

C语言实现Linux系统下ls命令的过滤文件功能

2018-02-03 16:17 721 查看



  
 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;
 }

 

  


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c语言