寫了一個腳本,可以按子產品統計源代碼的行數,呵呵。
輸出結果:
~ $ ./line-count
[module] [lines] [%]
FRED 4744 17.67%
dataset 8591 32.00%
core 9025 33.61%
image 803 2.99%
tape 1339 4.99%
license 16 0.06%
jni 1621 6.04%
util 264 0.98%
test 446 1.66%
total 26849
腳本如下:
#!/bin/sh
#
# $Id: line-count,v 1.2 2004/08/06 08:43:16 clkrst Exp $
#
# a source-file line counter for C++/C/Java
#
# i use the fixed module list instead of searching all sub-directory,
# because it can give me an exact control.
#
# [email protected]
#
# count the lines of source files under the given directory
# args: $1 the directory want to check.
# $2 options
function get_lines () {
find $1/* $2 | xargs wc -l | tail -1 | cut -b1-7
}
# declare the arrays
declare -a SOURCES # the directories to check
declare -a NAMES # the module names
declare -a LINES # the lines of each module
# the following expresses the line-percentage
# unit: 0.01
declare -a PERS # the integer part
declare -a FRAS # the fraction part
# here you can add as more SOURCES/NAMES as possible
# the source directory
SOURCES=("src"
"src/dataset"
"src/core"
"src/image"
"src/tape"
"src/license"
"jni"
"util")
# the module name of each directory
NAMES=("FRED"
"dataset"
"core"
"image"
"tape"
"license"
"jni"
"util")
# how many modules?
# should be equal to the sizeof(SOURCES) or sizeof(NAMES)
N_MOD=8
# extra modules
NAMES[$N_MOD]="test"
SOURCES[$N_MOD]="test"
LINES[$N_MOD]=`get_lines ${SOURCES[$N_MOD]} "-maxdepth 2 -name *.cpp -or -name *.h"` ;
N_MOD=$(( $N_MOD+1 ))
# count the lines of each module
L_TOTAL=$(( 0 ))
for (( i=0; $i<$N_MOD; i=$i+1 )) ; do
LINES[$i]=`get_lines ${SOURCES[$i]} "-maxdepth 2 -name *.cpp -or -name *.h -or -name *.java"` ;
L_TOTAL=$(( $L_TOTAL+${LINES[$i]} )) ;
done
# calculate the percentage
for (( i=0; $i<$N_MOD; i=$i+1 )) ; do
# the formula is:
# L_LINES/L_TOTAL * 100 + 0.5
# eliminate the float calculation
# (L_LINES * 100 + L_TOTAL/2) / L_TOTAL
# to get fraction part, we use
# fra(X) = (X*100) - (X*100)/100*100
# int(X) = (X*100) / 100
PERS[$i]=$(( (${LINES[$i]}*10000 + $L_TOTAL/2) / $L_TOTAL )) ;
FRAS[$i]=$(( ${PERS[$i]} - ${PERS[$i]}/100*100 ));
PERS[$i]=$(( ${PERS[$i]} / 100 ));
done
# output result
printf "[module]/t[lines]/t[%%]/n"
for (( i=0; $i<$N_MOD; i=$i+1 )) ;
do printf "%s/t/t%5d/t%2d.%02d%%/n" ${NAMES[$i]} ${LINES[$i]} ${PERS[$i]} ${FRAS[$i]};
done
printf "/ntotal/t/t%5d/n" $L_TOTAL
unset SOURCES NAMES LINES PERS
unset N_MOD L_TOTAL