歡迎轉載!轉載時請註明出處: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 levelsDescend 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參數。
總結
本次一句話腳本使用到了以下知識:
- find命令的-maxdepth, -type, -name參數
- cut命令的-f, -d參數
- sort命令
- uniq命令的-c, -i參數