欢迎转载!转载时请注明出处:http://blog.csdn.net/nfer_zhuang/article/details/42582425
引言
使用场景:
我所在的QQ群中最近聊的是热火朝天,也就导致着我的QQ缓冲文件夹的大小在疯涨,满500M的时候QQ客户端就会提示用户需要清除一下缓存文件夹了。其中缓冲文件夹中最大的部分就是各种图片文件,包括各种格式的图片。在删除前,我就想按照图片格式进行一下分类后备份到其他文件夹内。这个时候我就需要做一下统计了:
- 当前文件夹下有几种格式(后缀名)的图片
- 每种格式的图片有多少个文件
一般用法:
- 打开文件管理器,并进入到待统计的文件夹内
- 按照类型进行排序
- 依次选中指定后缀名的所有文件,在文件管理器中状态栏中有选中了多少个文件的统计,记录下来
- 再选择下一个后缀名的所有文件并统计和记录,直到所有都统计完成
一句话脚本用法:
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 (只查找当前文件夹,不进行递归操作)
上面的脚本分解步骤是:
- 查找所有文件名类型是*.*格式的文件
- 截取文件名中的后缀名部分
- 对后缀名进行排序后并统计
注:由于我的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.
在这里我的做法是:
- 只在当前文件夹下进行查找,所以使用-maxdepth 1参数(注意,如果有使用-maxdepth参数,必须是放到所有其他参数之前,否则会出现Waring信息)
- 只查找文件,而不需要关心文件夹,所以使用-type f参数(注意,在linux上会有链接文件、块文件等其它格式的文件类型,而且Window系统上的快捷方式其格式也是一般文件)
- 只过滤出有后缀名的文件,所以使用-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》使用示例演示了各个参数的用法,可前往一观。
总结
本次一句话脚本使用到了以下知识:
- find命令的-maxdepth, -type, -name参数
- cut命令的-f, -d参数
- sort命令
- uniq命令的-c, -i参数