shell
-
Read me
- 要求:Linux OS
- 准備:將下面的代碼放入文本文檔並重命名文件為“count_svn_files_size.sh”
- 使用:sh count_svn_files_size.sh YOUR_SVN_URL
-
源碼
#!/bin/bash
# 統計svn指定的url下所有文件的總大小,排除掉了目錄
# 使用方法: sh count_svn_files_size.sh YOUR_SVN_URL
# 舉例: sh count_svn_files_size.sh http://127.0.0.1/svn/abc/def
# 指定的url目錄
base_url=$1
# 用來臨時存儲svn目錄的文件
temp_dir_record="temp_dir_record.log"
# 總目錄數量
all_dir_num=0
# 判斷傳入的url是否為空
if [ "${base_url}" == "" ]; then
echo "empty svn url"
exit 1;
fi
# 刪除臨時文件,避免重復執行命令時收到干擾
rm -f ${temp_dir_record}
# 進度條方法: progress 1 100
# 參數1: 當前值
# 參數2: 總值
function progress () {
pro=`awk 'BEGIN{printf "%d",('$1'/'$2')*100}'`
spaces=`seq -s '#' $((${pro} +1)) | sed 's/[0-9]//g'`
if [ "${pro}" != "100" ]; then
printf "[%-100s] %d%% \r" "${spaces}" "${pro}"
else
printf "[%-100s] %d%% \n" "${spaces}" "${pro}"
fi
}
# 遞歸統計指定的url下有多少目錄,並緩存到臨時文件中
function count_dir() {
local url=$1
echo "counting dir: ${url}"
echo "${url}" >> ${temp_dir_record}
local arr=`svn list $url | grep '\/' | grep -v '\.\/'`
for d in ${arr}
do
d_url="${url}${d}"
count_dir ${d_url}
done
}
# 統計所有目錄下的所有文件
function count_files() {
local url=$1
local files_size=`svn list -v ${url} | grep -v '\.\/' | grep -v '\/' | awk '{sum+=$3} END {print sum}'`
if [ "${files_size}" == "" ]; then
echo 0
fi
echo ${files_size}
}
# 統計目錄
echo "start to count all dir"
starttime=`date +'%Y-%m-%d %H:%M:%S'`
count_dir "${base_url}/"
all_dir_num=`cat ${temp_dir_record} | wc -l`
echo "end to count all dir"
echo "all dir num is: ${all_dir_num}"
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "it took "$((end_seconds-start_seconds))"s"
# 統計文件的空間占用
echo "start to count repository size"
total_size=0
progress_num=0
starttime=`date +'%Y-%m-%d %H:%M:%S'`
for line in `cat ${temp_dir_record}`
do
size=$(count_files ${line})
total_size=$((${total_size} + ${size}))
progress_num=$((${progress_num} + 1))
progress ${progress_num} ${all_dir_num}
done
echo "end to count all file size"
echo "total size is: ${total_size}Bytes"
endtime=`date +'%Y-%m-%d %H:%M:%S'`
start_seconds=$(date --date="$starttime" +%s);
end_seconds=$(date --date="$endtime" +%s);
echo "it took "$((end_seconds-start_seconds))"s"