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); //关闭目录

方法一:

   采用字符串比较,从文件名的末尾开始遍历文件名这个字符串,若比较的后缀与我们要查找的后缀一致,即输出文件名。

  1. #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)
  2. {
     int flag=0;
  3.  struct dirent *file_name;
            if(argc!=3)
  4.  {
             printf("传参格式:./a.out <目录名称> <查找类型>\n");
                    return 0;
  5.  }
  6.  //打开目录
      DIR *dir=opendir(argv[1]);
      if(dir==NULL)
      {
        printf("%s目录打开失败!\n",argv[1]);
        return 0;
      }
  7.  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;
 }


 




  



Logo

更多推荐