ソースファイルの行数をカウントする

ステップ数だなんで高尚(?)なことは言わないが、単純にソースコードの行数を知りたいことが偶にある。それだけでもプログラムの規模の目安になるからだ。

という訳でWindows XPコマンドプロンプトで色々と試してみた。
以下、サンプルにLinux 0.01のソース一式を使用。Cのソースファイルとヘッダのみを対象としている。

ファイルが1つの場合

テキストファイルの改行数をカウントするプログラムは簡単に作れるが、既にあるものを使ったほうが効率的だ。というか、実はコマンドプロンプトの標準コマンドであるfindでファイルの行数を求めることができる。

$ find /c /v "" init\main.c

---------- INIT\MAIN.C: 147

$ find /c /v "" < init\main.c
147

Unix由来のツールであるwcでもファイルの行数をチェックできる。Windows用のバイナリもあるので、個人的にWindowsでもwcを使っている。

$ wc -l init\main.c
147 init\main.c

Windows用のwcを入手する方法は:

  • GnuWin32のFileUtilsかSh-Utilsをインストールする。
  • MinGWのMSYS(MSYS一式か、MSYSのうちのCoreUtils)をインストールする。
  • Cygwinをインストールする

UnixUtilにも含まれていた記憶があるが、肝心のUnixUtilは入手可能なんだろうか?

ファイルが複数の場合(但し同一ディレクトリ上)

私の場合、個々のファイルの行数ではなく、全ファイルの行数の合計を知りたい場合が圧倒的に多い。というのも「このプログラムの規模はどれくらいか?」を判断する材料にしたいからだ。

普段manとかをあまり見ないので、最近までcatでファイルを連結させてからパイプで流しこんでいた(catの代わりにWindowsのtypeコマンドでもOKだが、一々ファイル名が表示される)。

$ cd lib
$ cat *.c *.h | find /c /v ""
cat: *.h: Invalid argument
94

$ cat *.c *.h | wc -l
cat: *.h: Invalid argument
94

ヘッダファイルが無いので怒られた :)
しかし結果の94は正しい。

実はwcの引数には複数のファイルを指定できるので、catやtypeは不要だ。この場合、個々のファイルの行数が表示された後で、全ファイルの行数の合計が表示される。

$ wc -l *.c *.h
   7 _exit.c
   4 close.c
  29 ctype.c
   4 dup.c
   1 errno.c
   4 execve.c
  19 open.c
   4 setsid.c
   8 string.c
  10 wait.c
   4 write.c
wc: *.h: Invalid argument
  94 合計

ところで私は合計行数だけ欲しいのだが、wcのオプションではどうにもならないようなのでgawkなどでフィルタリングすることになる。

$ wc -l *.c *.h | gawk "{ field = $1 } END { print field }"
wc: *.h: Invalid argument
94