2018-02-03 16:17:30 JTang_TYX 阅读数 1578
  • Linux系统编程第2期:文件IO编程实战

    本课程是《嵌入式工程师自我修养》自学教程第 3 步:Linux系统编程第02期。 本期课程主要介绍跟文件、目录相关的文件IO函数的使用,通过编程实战形式,实现了常用的shell命令:ls\cat\rmdir\wc等。以及实现音频播放器V2.0版本:支持循环列表播放。通过10来个Linux环境下shell命令的编程实现,达到熟练掌握文件IO编程的学习目标。

    325 人正在学习 去看看 王利涛



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


 




  



2018-12-09 23:34:25 yychuyu 阅读数 498
  • Linux系统编程第2期:文件IO编程实战

    本课程是《嵌入式工程师自我修养》自学教程第 3 步:Linux系统编程第02期。 本期课程主要介绍跟文件、目录相关的文件IO函数的使用,通过编程实战形式,实现了常用的shell命令:ls\cat\rmdir\wc等。以及实现音频播放器V2.0版本:支持循环列表播放。通过10来个Linux环境下shell命令的编程实现,达到熟练掌握文件IO编程的学习目标。

    325 人正在学习 去看看 王利涛

在Linux下,ls这个命令大家肯定太熟悉了,良许相信只要是Linux工程师,每天都会离不开这个命令,而且一天会使用个几百次。但是,除了 ls -l 以外,你还知 ls 的哪些高级用法呢?良许今天为大家介绍 ls 命令的8种高级用法。

假如我们有这样的一个文件夹,我们用tree命令查看它的目录结构:

img

img

用法1:列出/home/alvin/test_dir目录下所有文件及目录的详细资料

命令:

ls -lR /home/alvin/test_dir/

结果:

[alvin@VM_0_16_centos test_dir]$ ls -lR /home/alvin/test_dir/
/home/alvin/test_dir/:
total 28
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 atb_aux.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 atb_ota.c
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 include
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 Makefile
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 output
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 src

/home/alvin/test_dir/include:
total 0
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 a.h
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 b.h
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 c.h

/home/alvin/test_dir/output:
total 0
-rwxrwxr-x 1 alvin alvin 0 Nov 18 09:12 app

/home/alvin/test_dir/src:
total 0
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 a.c
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 b.c
-rw-rw-r-- 1 alvin alvin 0 Nov 18 09:12 c.c

在这里,-l 选项大家应该比较熟悉,是以列表的形式显示结果的意思。而对于 -R 选项,意思是递归处理,将指定目录下的所有文件及子目录一并处理。

用法2:列出/home/alvin/test_dir目录下以atb开头的所有文件的详细内容

命令:

ls -l atb*

结果:

[alvin@VM_0_16_centos test_dir]$ ls -l atb*
-rw-rw-r-- 1 alvin alvin 37 Nov 18 09:12 atb_aux.c
-rw-rw-r-- 1 alvin alvin  8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin 24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin  5 Nov 18 09:12 atb_ota.c

用法3:只列出目录下的子目录

  • 方法1

命令

ls -F /home/alvin/test_dir | grep /$

结果:

[alvin@VM_0_16_centos test_dir]$ ls -F /home/alvin/test_dir | grep /$
include/
output/
src/

其中:-F选项表示在每个文件名后附上一个字符以说明改文件的类型。“*”:表示可执行的普通文件;“/”:表示目录;“@”:表示符号链接;“|”:表示FIFOs;“=”:表示套接字。

/$ 其实是一个正则表达式,表示以 / 结尾。grep /$ 表示过滤出以 / 结尾的结果,也就是子目录。

  • 方法2

命令:

ls -p /home/alvin/test_dir | grep /$

结果:

[alvin@VM_0_16_centos test_dir]$ ls -p | grep /$
include/
output/
src/

其中:-p 选项与 -F 选项类似,也是在每个文件名后附上一个字符以说明改文件的类型。

  • 方法3

命令:

ls -l /home/alvin/test_dir | grep "^d"

结果:

[alvin@VM_0_16_centos test_dir]$ ls -l /home/alvin/test_dir | grep "^d"
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 include
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 output
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 src

其中:^d 也是一个正则表达式,表示以 d 开头。grep "^d" 表示过滤出以 d 开头的结果,而 ls -l 所列出来的结果,首位如果是 d 的话,表示这个文件是个目录,这样就可以过滤出子目录了。

  • 方法4

命令:

ls -d */

结果:

[alvin@VM_0_16_centos test_dir]$ ls -d */
include/  output/  src/

其中:-d 选项表示将目录象文件一样显示,而不显示其下的文件。

用法4:按时间顺序列出目录下的文件,越新越排后面。

命令:

ls -ltr

结果:

[alvin@VM_0_16_centos test_dir]$ ls -lrt
total 28
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 src
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 output
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 Makefile
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 include
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 atb_ota.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 atb_aux.c

其中:-t 选项表示以文件修改时间排序,越新的越靠前。-r 选项表示对结果进行反向排序,二者结合的话表示以修改时间排序,越新的越靠后。

用法5:以文件大小进行排序

命令:

ls -lhS

结果:

[alvin@VM_0_16_centos test_dir]$ ls -lhS
total 28K
drwxrwxr-x 2 alvin alvin 4.0K Nov 18 09:12 include
drwxrwxr-x 2 alvin alvin 4.0K Nov 18 09:12 output
drwxrwxr-x 2 alvin alvin 4.0K Nov 18 09:12 src
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 atb_aux.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 atb_orch.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 atb_can.c
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 atb_ota.c
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 Makefile

其中:-h 选项表示以可读选项显示,否则文件大小是默认以字节数显示,比如:4873字节,你知道是多少吗?加了 -h 选项系统就帮你换算成以k或者其它单位的结果。

-S 选项表示以文件大小进行排序,文件越大越靠前。想要文件小者靠前的话,加个 -r 选项就行。

用法6:统计当前目录下的文件数和目录数

  • 统计文件数

命令:

ls -l | grep "^-" | wc -l

结果:

[alvin@VM_0_16_centos test_dir]$ ls -l | grep "^-" | wc -l
5

其中:^- 表示以 - 开头,即普通文件,ls -l | grep "^-" 过滤出普通文件,再用 wc -l统计过滤出的普通文件的个数。

  • 统计目录数

命令:

ls -l | grep "^d" | wc -l

结果:

[alvin@VM_0_16_centos test_dir]$ ls -l | grep "^d" | wc -l
3

其中:^d 表示以 d 开头,即目录,ls -l | grep "^d" 过滤出目录,再用 wc -l 统计过滤出的目录的个数。

用法7:列出所有文件的绝对路径

命令:

ls | sed "s:^:`pwd`/:"

结果:

[alvin@VM_0_16_centos test_dir]$ ls | sed "s:^:`pwd`/:"
/home/alvin/test_dir/atb_aux.c
/home/alvin/test_dir/atb_can.c
/home/alvin/test_dir/atb_orch.c
/home/alvin/test_dir/atb_ota.c
/home/alvin/test_dir/include
/home/alvin/test_dir/Makefile
/home/alvin/test_dir/output
/home/alvin/test_dir/src

其中:sed "s:^:``pwd``/:" 表示在行首增加 pwd(即文件所在路径),与文件名组合成绝对路径。

用法8:列出当前目录下的所有文件(包括隐藏文件)的绝对路径, 对目录不做递归

在上一个用法里,对于隐藏文件(即以 . 开头的文件)是不作处理的,如果我们需要对隐藏文件也作处理的话,就需要使用下面这个命令:

find $PWD -maxdepth 1 | xargs ls -ld

结果:

[alvin@VM_0_16_centos test_dir]$ find $PWD -maxdepth 1 | xargs ls -ld
drwxrwxr-x 5 alvin alvin 4096 Nov 18 17:30 /home/alvin/test_dir
-rw-rw-r-- 1 alvin alvin   37 Nov 18 09:12 /home/alvin/test_dir/atb_aux.c
-rw-rw-r-- 1 alvin alvin    8 Nov 18 09:12 /home/alvin/test_dir/atb_can.c
-rw-rw-r-- 1 alvin alvin   24 Nov 18 09:12 /home/alvin/test_dir/atb_orch.c
-rw-rw-r-- 1 alvin alvin    5 Nov 18 09:12 /home/alvin/test_dir/atb_ota.c
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 /home/alvin/test_dir/include
-rw-rw-r-- 1 alvin alvin    0 Nov 18 09:12 /home/alvin/test_dir/Makefile
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 /home/alvin/test_dir/output
drwxrwxr-x 2 alvin alvin 4096 Nov 18 09:12 /home/alvin/test_dir/src

其中:find $PWD -maxdepth 1 限定了在当前层级(即不递归),再对find结果传递给 ls -ld 作参数,这样就将当前目录下的所有文件补齐了所在路径。

---------------

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群。

 

2016-09-17 11:29:47 u013013024 阅读数 2583
  • Linux系统编程第2期:文件IO编程实战

    本课程是《嵌入式工程师自我修养》自学教程第 3 步:Linux系统编程第02期。 本期课程主要介绍跟文件、目录相关的文件IO函数的使用,通过编程实战形式,实现了常用的shell命令:ls\cat\rmdir\wc等。以及实现音频播放器V2.0版本:支持循环列表播放。通过10来个Linux环境下shell命令的编程实现,达到熟练掌握文件IO编程的学习目标。

    325 人正在学习 去看看 王利涛

ls -l |grep java|wc -l 或 find ./root -type f | wc -l  过滤java文件

查看某文件夹下文件的个数,包括子文件夹里的。

 ls -lR|grep java|wc -l 

查看某文件夹下文件夹的个数,包括子文件夹里的。

 ls -lR|grep javawc -l 说明: ls -l

长列表输出该目录下文件信息(注意这里的文件,不同于一般的文件,可能是目录、链接、设备文件等) 

grep "^-" 

这里将长列表输出信息过滤一部分,只保留一般文件,如果只保留目录就是 ^d 

wc -l 统计输出信息的行数,因为已经过滤得只剩一般文件了,所以统计结果就是一般文件信息的行数,又由于 一行信息对应一个文件,所以也就是文件的个数。 

Linux查看文件夹大小

du -sh 查看当前文件夹大小 

du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序 

du -sk filename 查看指定文件大小

如果要过滤特定文件的文件名过滤,直接可以查看grep表达式的正则即可

2013-06-27 11:34:13 azhangyi188 阅读数 3905
  • Linux系统编程第2期:文件IO编程实战

    本课程是《嵌入式工程师自我修养》自学教程第 3 步:Linux系统编程第02期。 本期课程主要介绍跟文件、目录相关的文件IO函数的使用,通过编程实战形式,实现了常用的shell命令:ls\cat\rmdir\wc等。以及实现音频播放器V2.0版本:支持循环列表播放。通过10来个Linux环境下shell命令的编程实现,达到熟练掌握文件IO编程的学习目标。

    325 人正在学习 去看看 王利涛
ls | grep “^s” 使用管道过滤
2019-03-26 00:18:44 weixin_38289196 阅读数 250
  • Linux系统编程第2期:文件IO编程实战

    本课程是《嵌入式工程师自我修养》自学教程第 3 步:Linux系统编程第02期。 本期课程主要介绍跟文件、目录相关的文件IO函数的使用,通过编程实战形式,实现了常用的shell命令:ls\cat\rmdir\wc等。以及实现音频播放器V2.0版本:支持循环列表播放。通过10来个Linux环境下shell命令的编程实现,达到熟练掌握文件IO编程的学习目标。

    325 人正在学习 去看看 王利涛

ls /VodDir/ | grep  '[0-9]' | grep -v grep |awk '{system("rm -rf "$1)}' 

grep 表示过滤 

awk 表示执行括号()里面的语句

'[0-9]' 表示正则表达式

grep -v grep 表示过滤grep这个命令

表示删除/VodDir/下面以数字名命名的文件夹

linux基本命令1---ls

阅读数 117

没有更多推荐了,返回首页