一句话脚本系列之统计文件夹下各种后缀名的文件个数

欢迎转载!转载时请注明出处:http://blog.csdn.net/nfer_zhuang/article/details/42582425

引言

使用场景:

我所在的QQ群中最近聊的是热火朝天,也就导致着我的QQ缓冲文件夹的大小在疯涨,满500M的时候QQ客户端就会提示用户需要清除一下缓存文件夹了。其中缓冲文件夹中最大的部分就是各种图片文件,包括各种格式的图片。在删除前,我就想按照图片格式进行一下分类后备份到其他文件夹内。这个时候我就需要做一下统计了:

  1. 当前文件夹下有几种格式(后缀名)的图片
  2. 每种格式的图片有多少个文件
一般用法:
  1. 打开文件管理器,并进入到待统计的文件夹内

  2. 按照类型进行排序
  3. 依次选中指定后缀名的所有文件,在文件管理器中状态栏中有选中了多少个文件的统计,记录下来

  4. 再选择下一个后缀名的所有文件并统计和记录,直到所有都统计完成

一句话脚本用法:

find -type f -name "*.*" | cut -f3 -d'.' | sort | uniq -c -i  (递归查找当前文件夹下的所有子文件夹)
或
<pre name="code" class="plain">find -maxdepth 1 -type f -name "*.*" | cut -f3 -d'.' | sort | uniq -c -i  (只查找当前文件夹,不进行递归操作)
 上面的脚本分解步骤是: 
 
  1. 查找所有文件名类型是*.*格式的文件
  2. 截取文件名中的后缀名部分
  3. 对后缀名进行排序后并统计

注:由于我的QQ是运行在Window系统,所以上述脚本是通过Cynwin执行的。

find命令部分说明

先看一下find的man手册中的描述:

   -maxdepth levels
          Descend  at  most  levels  (a non-negative integer) levels of directories below the command line arguments.
   -type c
          File is of type c:
              d      directory
              f      regular file
   -name pattern
          Base of file name (the path with the leading directories  removed)  matches  shell  pattern  pattern.  

在这里我的做法是:

  1. 只在当前文件夹下进行查找,所以使用-maxdepth 1参数(注意,如果有使用-maxdepth参数,必须是放到所有其他参数之前,否则会出现Waring信息)
  2. 只查找文件,而不需要关心文件夹,所以使用-type f参数(注意,在linux上会有链接文件、块文件等其它格式的文件类型,而且Window系统上的快捷方式其格式也是一般文件)
  3. 只过滤出有后缀名的文件,所以使用-name "*.*"参数(注意,使用-name "*.*"参数也会过滤出.name和name.这样的文件,因此要严格过滤出*.*且"."前后都有字符的文件,可以使用-regex "\./.+\..+"参数,具体作用请百度“find正则表达式”)

cut命令部分说明

同理,先看一下cut的man手册中的描述:

   -f, --fields=LIST
          select  only  these fields;  also print any line that contains no delimiter character, unless the -s option is specified
   -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter

上面的find命令后输出的内容是按照下述的格式:

./a.png
./b.jpg

...

那么,在这里我们就只需要第二个"."之后的内容,所以使用了-d'.'参数指定了使用'.'作为分隔符,然后使用-f3来明确输出第三个字段的内容,即所有的后缀名。

sort命令和uniq命令部分说明

sort命令很好理解,就是对前面的输出进行一下排序,以便与uniq命令操作。

我们重点看一下uniq命令的使用,man手册上是这么描述uniq命令的作用的:

       uniq - report or omit repeated lines

其大致作用就是找到连续重复的行,并报告出来。注意,uniq关注的是:1.必须是连续重复,所以使用之前先进行了sort排序;该命令的操作对象是行,因此如果是统计段落内的重复单词请不要使用该命令。

下面再看一下uniq的-c和-i参数的说明:

   -c, --count
          prefix lines by the number of occurrences
   -i, --ignore-case
          ignore differences in case when comparing

在这里,我们的需求是把所有的重复行(后缀名)出现的次数统计出来,所以使用了-c参数;而且,在window系统是不区分大小写的,所以也使用了-i参数。

注:有一篇专门讲uniq命令的博文《 实例解说Linux命令行uniq》使用示例演示了各个参数的用法,可前往一观。

总结

本次一句话脚本使用到了以下知识:

  1. find命令的-maxdepth, -type, -name参数
  2. cut命令的-f, -d参数
  3. sort命令
  4. uniq命令的-c, -i参数


猜你喜欢

转载自blog.csdn.net/nfer_cn/article/details/42582425
今日推荐