一句話腳本系列之統計文件夾下各種後綴名的文件個數

歡迎轉載!轉載時請註明出處: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參數


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章