日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

统计一下你写过多少代码

發(fā)布時(shí)間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 统计一下你写过多少代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


?

最近整理了一下自己從開始學(xué)習(xí)編程以來寫過的程序和代碼,林林總總,花了不少的時(shí)間,最后把一些自認(rèn)為還算不錯(cuò)的代碼提交到github上做一個(gè)簡(jiǎn)單的分類和備份。當(dāng)然我并不奢求它們能成為多好的開源代碼,只是希望通過這種方式分享自己的勞動(dòng)成果罷了。如果大家有興趣可以訪問我的github,歡迎朋友們提出意見和建議。

在我整理代碼的時(shí)候,突發(fā)奇想地想知道自己曾經(jīng)寫過多少行代碼。相信手握大量代碼的童鞋應(yīng)該也有類似的想法,于是查閱資料來完成這個(gè)目標(biāo)。

首先,我們需要一點(diǎn)時(shí)間做一下準(zhǔn)備工作。我們需要將自己寫過的程序拷貝到一個(gè)文件夾下邊,以防我們把一些教程和示例的代碼也統(tǒng)計(jì)進(jìn)去了,這的確需要不少精力——如果你的代碼遍布在你硬盤的各個(gè)角落的話。

為了統(tǒng)計(jì)代碼的行數(shù),我們需要用到linux提供的工具wc(名字有點(diǎn)詭異,呵呵)。

$wc –l *.c *.h

該命令可以將當(dāng)前目錄下的所有以.c、.h結(jié)尾的文件的行數(shù)統(tǒng)計(jì)并累加。但是該工具的功能十分有限,它只能操作當(dāng)前目錄下的文件,而不會(huì)去遞歸查詢子目錄。顯然統(tǒng)計(jì)大量的工程和文件的行數(shù)是不可行的,不過所幸的是我們可以使用find命令遞歸的查詢子目錄的文件。

$find . –iname “*.[ch]”

該命令可以將當(dāng)前目錄以及子目錄下的所有以.c、.h.C.H結(jié)尾的文件全部列舉出來!(有時(shí)我們的代碼的擴(kuò)展名命名可能不是太規(guī)范,有可能擴(kuò)展名是大寫的,使用-name是大小寫敏感查詢,使用-iname忽略大小寫)。

有了以上的命令,我們想把所有以.c、.h、.C.H結(jié)尾的文件的代碼行統(tǒng)計(jì)并累加。借助shell的管道可以輕松實(shí)現(xiàn)。

$find . –iname “*.[ch]” | xargs wc -l

管道“|”的含義是將前邊的命令的輸出作為后邊指令的輸入,而xargs工具將find命令的輸出轉(zhuǎn)換為wc命令的參數(shù)。

以上便是統(tǒng)計(jì)代碼行的基本命令原型,如果統(tǒng)計(jì)C語(yǔ)言的代碼則足夠了,但這還不能滿足我們的需要。如果讀者手頭有大量的C#、JavaC++、匯編代碼的話,使用find提供的功能有限的通配符并不方便。因?yàn)槲覀兛赡芴幚淼奈募袷接?#xff1a;.cs.java.cpp.s、.asm等,如果你有很多的ASP、JSP這樣的網(wǎng)站工程的話,可能還需要.html、.css、.js等格式的代碼(雖然.html文件不像是代碼……)。

為了方便處理各種文件格式,我們需要寫一段shell腳本。其基本思想是每次只搜索一種格式的文件,然后將所有的搜索結(jié)果集合到一個(gè)文件中去,最后將該文件的內(nèi)容作為wc命令的參數(shù)進(jìn)行行數(shù)統(tǒng)計(jì)即可。

#/user/bin/sh

cat /dev/null > info?????????#清空info

types=("*.asm" "*.s" "*.c" "*.cpp" "*.h" "*.cs" "*.java")???#所有要統(tǒng)計(jì)的文件類型

for i in ${types[@]}?????????#遍歷每個(gè)文件類型

do

find . -iname $i > tmp???#按類型(大小寫不敏感)查找,緩存到tmp

cat tmp >> info??????????#將查詢結(jié)果追加到info

done

sed -i 's/ /\\&/g' info??????#處理文件名出現(xiàn)空格的情況

cat info | xargs wc -l???????#統(tǒng)計(jì)行數(shù)

rm info tmp??????????????????#刪除臨時(shí)文件

結(jié)合腳本,首先我們需要建立兩個(gè)臨時(shí)文件tmpinfo,前者用于記錄每個(gè)文件類型的查詢結(jié)果,后者記錄所有的查詢結(jié)果(初始清空)。然后使用types數(shù)組記錄所有要統(tǒng)計(jì)的文件擴(kuò)展名(這里的類型匹配串一定不要重復(fù),否則會(huì)重復(fù)統(tǒng)計(jì)),并使用循環(huán)依次使用find命令將結(jié)果重定向(>)到文件tmp中,然后將tmp追加(>>)到文件info。接著我們使用sed命令對(duì)info文件做一下處理——將文件內(nèi)的所有空格前加上反斜杠“\”。這是因?yàn)槿绻募嬖诳崭竦脑?#xff0c;將之應(yīng)用到wc命令中后會(huì)導(dǎo)致命令被截?cái)?#xff0c;產(chǎn)生錯(cuò)誤,因此需要使用“\”對(duì)空格轉(zhuǎn)義。最后使用管道將文件內(nèi)容應(yīng)用到wc命令的參數(shù),統(tǒng)計(jì)即可得到最終結(jié)果。

將上述腳本文件保存后,使用chmod命令轉(zhuǎn)換為可執(zhí)行權(quán)限,運(yùn)行進(jìn)行行數(shù)統(tǒng)計(jì)。

$chmod +x ./腳本文件名

運(yùn)行命令,在輸出的結(jié)果中,最后一行一般都會(huì)顯示如下信息:

{總行數(shù)} {總用量}

如果統(tǒng)計(jì)出的的代碼文件個(gè)數(shù)較少,最后一行的總行數(shù)便是結(jié)果。然而wc命令一次處理的文件個(gè)數(shù)有限(大約3000個(gè)左右),當(dāng)統(tǒng)計(jì)的文件過多時(shí),它會(huì)分批進(jìn)算總行數(shù)!這樣最終的總行數(shù)其實(shí)是每批統(tǒng)計(jì)的行數(shù)之和!我們可以使用如下命令將每批的行數(shù)信息顯示出來。

$cat info | xargs wc -l | sort -n

sort -n命令可以將文件按行大小排序,使得所有行數(shù)信息集中顯示在文件尾部。當(dāng)然更好的是使用如下方式。

$cat info | xargs wc -l > tmp

$grep -rin "^[ ]*[1-9][0-9]*[ ]*總用量$" tmp

grep命令按照每批統(tǒng)計(jì)的結(jié)果形式識(shí)別并輸出如下形式。

{行號(hào)}: {總行數(shù)} {總用量}

當(dāng)然,我們可以手工的將行數(shù)累加起來,得到最終的行數(shù)。雖然工作量不大(確實(shí)不大,即使linux的內(nèi)核源碼也就十幾條數(shù)據(jù)),但是我們想讓它自動(dòng)完成。

#/user/bin/sh

cat /dev/null > info????????#清空info

types=("*.asm" "*.s" "*.c" "*.cpp" "*.h" "*.cs" "*.java")??#所有要統(tǒng)計(jì)的文件類型

for i in ${types[@]}????????#遍歷每個(gè)文件類型

do

??? find . -iname $i > tmp??? #按類型(大小寫不敏感)查找,緩存到tmp

??? cat tmp >> info?????????? #將查詢結(jié)果追加到info

done

sed -i 's/ /\\&/g' info?????#處理文件名出現(xiàn)空格的情況

cat info | xargs wc -l > tmp#統(tǒng)計(jì)行數(shù),輸出到文件

grep -rin "^[ ]*[1-9][0-9]*[ ]*總用量$" tmp > info???#提取行數(shù)信息

let sum=0???????????????????#總行數(shù)

while read tag count flag???#取出每一批處理結(jié)果的行數(shù)

do

??? let sum=sum+count???????? #累加行數(shù)

done < info?????????????????#指定讀取的文件

echo 總行數(shù)=$sum???????????#顯示最終總行數(shù)

rm info tmp?????????????????#刪除臨時(shí)文件

相比與之前的腳本,我們把統(tǒng)計(jì)的文件的行數(shù)信息保存在tmp,然后使用grep命令將有效的行數(shù)信息保存在info,最后讀取info的每一行,取出每一批的行數(shù),累加得到最終結(jié)果!而且由于不用向屏幕輸出大量的文件路徑信息(重定向到文件內(nèi)),腳本可以更快的運(yùn)行。經(jīng)測(cè)試,對(duì)于linux3.5.2內(nèi)核的源碼,該腳本執(zhí)行時(shí)間約2s左右(使用time命令測(cè)試,具體情況因機(jī)器而異),統(tǒng)計(jì)的源碼行數(shù)為14557019行!統(tǒng)計(jì)linux源碼行數(shù)時(shí),我們也可以修改types數(shù)組,僅統(tǒng)計(jì)*.s*.asm、*.c、*.h文件,因?yàn)?span style="font-family:Times New Roman">linux源碼里只有C和匯編代碼。

作者平時(shí)使用匯編、 C/C++、 C#Java寫過的代碼比較多,使用上述腳本統(tǒng)計(jì)完全沒問題,統(tǒng)計(jì)結(jié)果為 10W+。如果讀者還需統(tǒng)計(jì)其他類型的文件,可以自行修改 types數(shù)組(注意不要在數(shù)組元素間加逗號(hào)!)進(jìn)行統(tǒng)計(jì),你是否愿意 一下自己的代碼行數(shù)呢?

總結(jié)

以上是生活随笔為你收集整理的统计一下你写过多少代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。