統計文件夾下某類文件大小的小腳本


背景需求

我的站點使用 hexo 生成靜態文件存放在新浪雲服務器上,因為靜態文件都做為代碼存放上傳,新浪雲默認提供的代碼空間是100M,因此我經常關注 hexo 生成的 public 文件夾的使用情況。

最近發現 public 使用已經到了 91M,感覺很快就會超過 100M 的上限了。因此需要對生成的靜態文件做一些分析,看是否還有優化壓縮的空間。

hexo 生成的靜態文件主要有兩類,一類是 markdown 轉換后的 html 文件,另一大塊主要是 文章中引用的圖片。由此產生了一個需求,我需要統計 pubic 文件夾下(包括子文件夾)圖片占用的空間大小。

統計腳本

經過幾個小時的編寫,終於完成了這個統計腳本 count_file.sh 。支持統計某個文件夾下(包含子文件夾)某一類文件的大小,或者除某一類文件外其他文件的大小。

#!/bin/bash

# 統計一個目錄下指定類型或限制某種類型以外的文件的大小,包括子目錄

help() {
  echo "Description: 用於查找某個目錄下特定類型文件的數量和總的大小,或者查找某種類型以外的文件數量和總的大小"
  echo "Author: cocowool <cocowool@qq.com>, Blog: http://www.edulinks.cn"
  echo "Usage: sh count_file.sh -p folder_path [ -t jpg ] [ -x html ] "
  echo "       -p : 需要查找的文件路徑"
  echo "       -t : 需要查找的文件類型"
  echo "       -x : 需要排除的文件類型"
  exit 0
}

if [[ $# == 0 ]] || [[ "$1" == "-h" ]]; then
  help
  exit 0
fi

# INCLUDE_FILE_TYPE=""
# EXCLUDE_FILE_TYPE=""

# echo $*
while getopts "p:t:x:" opt
do
  case "$opt" in
    p) 
      FOLDER_PATH=$OPTARG ;;
    t) 
      # echo "Found t option"
      INCLUDE_FILE_TYPE=$OPTARG ;;
    x)
      # echo "Found x option"
      EXCLUDE_FILE_TYPE=$OPTARG ;;
    # getopts doesn't support long option, such as --option
    # debug)
    #   echo "Found debug option"
    #   echo $OPTARG ;;
    *) echo "$opt is invalid option" ;;
  esac
done

# FOLDER_PATH="/Users/shiqiang/Projects/edulinks-blog/public"
# 解決文件中含有空格的問題
IFS=$(echo "\n\b")

echo "查找的文件路徑為:$FOLDER_PATH"

if [ -n $FOLDER_PATH ]; then
  #list=`find $FOLDER_PATH | grep "jpg"`
  if [ -n "$INCLUDE_FILE_TYPE" ]; then
    echo "查找的文件后綴為:$INCLUDE_FILE_TYPE."
    list=`find $FOLDER_PATH -type f -name "*.$INCLUDE_FILE_TYPE"`
  elif [ -n "$EXCLUDE_FILE_TYPE" ]; then
    echo "查找文件后綴不是:$EXCLUDE_FILE_TYPE 的文件"
    list=`find $FOLDER_PATH -type f ! -name "*.$EXCLUDE_FILE_TYPE"`
  fi

  for i in $list
    do
    # echo $i
    fileSize=$(du -k "${i}" | cut -f1)
    # echo $fileSize
    ((totalSize=fileSize+totalSize))
  done

  echo "文件總大小為:$((totalSize/1024))M"
fi

基礎命令

這個腳本難點在於命令行參數的處理,因為寫這個腳本查閱了一些資料,主流的方案是使用下面兩個命令:

  • getopts 是 Linux 系統中的一個內置變量,一般通過循環的方式使用,每次循環 getopts 都會檢查命令行選項,並將命令行選項的值爆存在 OPTARG 變量中
  • getopt 是一個外部命令,相較於 getopts 命令能夠支持長參數,但是使用起來較 getopts 復雜

本文中因為參數比較少且沒計划使用長參數,因此采用了 getopts 來處理選項和參數問題。如果不熟悉 shell 的使用,可以查看 Shell 入門詳解(一) ,希望能有所幫助。

寫在最后

最后統計發現,我寫了 470 篇博客,引用了 700 多張圖片。其中 html 文件大小占用了 11M 的空間,而圖片占用了 79M 的空間。如果后續的文章還要放很多圖片的話,很快源碼空間就會使用完,看來是要考慮准備用圖床的方案來存放博客的圖片了。

各位自己有獨立博客的小伙伴,有沒有圖床服務提供,歡迎給我些指導。

參考資料

  1. 查找多個指定文件或者排除某類文件
  2. Shell 腳本如何輸出幫助信息?
  3. 給你的shell腳本寫一個--help文檔
  4. 編寫可接受選項和參數的shell腳本
  5. getopts 的使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM