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

欢迎转载!转载时请注明出处: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参数
时间: 2024-10-23 03:52:09

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

java批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码

原文:java批量修改指定文件夹下所有后缀名的文件为另外后缀名的代码 源代码下载地址:http://www.zuidaima.com/share/1550463660264448.htm 今天有个需求,想把某个文件夹下所有后缀名为jsp的更改为ftl,本来想用bat实现对bat的高级语法也不太了解,后来发现还需要递归遍历所有的子文件夹,所以用java实现了一个功能一样的代码,有需要的牛人可以下载修改为自己想要的. 这样可以兼容windows和linux. package com.zuidaima

判断一个文件是否是指定后缀名的文件

package com.toogen.log4j; import java.io.File; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class FileTest { private static Log log = LogFactory.getLog(FileTest.class); /** * 测试 * @param args */ public s

Python批量删除指定文件夹下的指定类型的文件

Python作为一种脚本语言,其非常适合文件级的各种操作.下面的代码可以批量删除指定文件夹下的全部特定类型(CSV类型)的文件. import sys, csv , operator import os import glob for i in range(0, 20): path = "C:\\Python34\\Folder_" + str(i) for infile in glob.glob( os.path.join(path, '*.csv') ): os.remove(in

Android-取出SDcard卡下指定后缀名的文件

Android--取出SDcard卡上指定后缀名的文件 1. import java.io.File; import java.io.FilenameFilter; /** * 后缀名过滤器 * @author ZLQ * */ public class FileNameSelector implements FilenameFilter{ String extension = "."; public FileNameSelector(String fileExtensionNoDot

Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例

1. 案例: 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名. 2. 案例代码如下: (1)思路是:先获取所有的文件和文件夹封装的对象,然后遍历的时候,依次判断,如果满足条件就输出. 1 package com.himi.filesdemo; 2 3 import java.io.File; 4 5 6 /** 7 * 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名 8 * @author hebao 9 * 10 */ 11 public class

linux下定期删除指定文件夹下2天前的文件

vi编脚本delete-log.sh内容如下:find /home/ctbackup/ -mtime +2 -name orabackup- -exec rm -rf {} \;find /home/ctbackup/ -mtime +2 -name OilDaQingAllinoneM- -exec rm -rf {} \; 设定执行脚本时间:每天3点执行脚本命令crontab -e0 3 * /home/delete-log.sh 原文地址:https://blog.51cto.com/su

将某一个路径下的所有java文件复制到另外一个文件夹下,并重命名为jad文件

需求很简单,程序也不难.看到题目之后,自己第一次没有使用eclipse,而是使用了编辑器,手编了一个程序,简陋,但实现了功能. 代码如下: import java.io.*; class Copy{ public void copy(String srcPath, String targetPath) throws Exception{ File srcFolder = new File(srcPath); File tarFolder = new File(targetPath); if(!t

把一个文件夹下的多个excel文件合并到同一个excel的一个sheet里

#!/usr/bin/python # -*- coding: UTF-8 -*- import pandas as pd import os if __name__ == '__main__': Folder_Path = 'c:\data1' os.chdir(Folder_Path) file_list = os.listdir() dfs = [] for item in file_list: dfs.append(pd.read_excel(Folder_Path + '\\' + i

文件夹下迭代查询文件

[客户需求]:由于客户需要查询的图片太多(每天好多张),通过文章登记或者附件上传太麻烦,想要通过FTP上传到服务器中,然后在前台查询,将图片显示出来.但图片太多,每天上传,为了管理方便,每天新建一个文件夹,直接将文件夹中的图片上传,而该文件夹下又有若干层和若干个子文件夹. [分析]:文件夹不确定,文件夹名字也不确定,甚至图片的格式也不确定,而用户输入一个图片编号(图片名字,如:_20140926135.JPG 编号:20140926135),则需要将所在文件夹中的图片编号和图片显示出来.那么则需