天天看點

統計源代碼行數的shell腳本

寫了一個腳本,可以按子產品統計源代碼的行數,呵呵。

輸出結果:

~ $ ./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