コードの行を数えますか?


24

コードの行を数えたい場合、些細なことは

cat *.c *.h | wc -l

しかし、複数のサブディレクトリがある場合はどうなりますか?



3
トピック外:なぜ不要なのcatか?wc -l *.c *.h同じことをします。
トーマスパドロン-マッカーシー

5
@ ThomasPadron-McCarthyいいえ、そうではありません。wc -l *.c *.h | tail -n 1同様の出力を取得する必要があります。
ジル 'SO-悪であるのをやめる'

2
いくつかの(場合によってはほとんどの)最新のシェル(Bash v4、Zsh、おそらくそれ以上)がを使用して再帰的グロブメカニズムを提供しているため、**使用wc -l **/*.{h,c}するか類似したものであることに注意してください。少なくともBashでは、このオプション(と呼ばれるglobstar)はデフォルトでオフになっていることに注意してください。ただし、この特定のケースでは、clocまたはSLOCCountはるかに優れたオプションであることに注意してください。(また、ソースファイルを簡単に検索/一覧表示ackするよりも望ましい場合がありfindます。)
カイルストランド

5
wc -lは、コード行ではなく行をカウントします。7000の空白行はwc -lに表示されますが、コードメトリックにはカウントされません。(コメントも通常カウントされません)
-coteyr

回答:


49

最も簡単な方法は、というツールを使用することですcloc。次のように使用します:

cloc .

それでおしまい。:-)


1
-1。このプログラムには、その小さな退屈な頭脳以外の言語のコード行を認識する方法がないためです。AdaとPascalとCとC ++とJavaとJavaScriptと「エンタープライズ」型言語については知っていますが、ファイル拡張子だけでSLOCをカウントすることを拒否しているため、DSLやまったく知らない言語にとってもまったく役に立ちません。約。

21
@cat完璧なものはありません。また、過去と将来のすべての要求を満たすことはできません。
Ho1

2
まあ、CLOCが認めることを拒否するプログラミング言語は、実際に私の過去と将来のすべての要求を満たします:)
cat

6
@catは、CLOCのドキュメントによると、言語定義ファイルで読み取ることができるため、定義されていない言語のコードを認識させる方法があります。さらに、オープンソースなので、いつでも拡張して改善できます!
Centimane

39

あなたはおそらく使用すべきSLOCCountまたはCLOCを、このために、彼らは関係なく、ディレクトリ構造の等;、プロジェクト内のソースコードの行をカウントするために特別に設計されています どちらか

sloccount .

または

cloc .

現在のディレクトリから始まるすべてのソースコードに関するレポートを生成します。

findand を使用する場合wc、GNUにwcは次の素晴らしい--files0-fromオプションがあります。

find . -name '*.[ch]' -print0 | wc --files0-from=-

clocの提案をしてくれたSnakeDocに感謝!)


sloccountの場合は+1。興味深いことに、実行sloccount /tmp/stackexchange(最近の再起動後5月17日に再度作成)により、見つかったsh、perl、awkなどのファイルの開発にかかる推定コストは$ 11,029であることがわかります。また、スクリプトファイルにしたことがないワンライナーは含まれていません。
cas

11
コード行に基づいてコストを見積もりますか?スパゲッティを保守可能なものにリファクタリングするために雇用されたすべての人々はどうですか?
停止ハーミングモニカ

@OrangeDogを使用すると、オーバーヘッドを常に考慮に入れることができます。計算の説明(非常に古い給与データを使用)および調整可能なパラメーターについては、ドキュメントを参照してください。
スティーブンキット

5
cloc同様に良い:github.com/AlDanial/cloc
SnakeDoc

@StephenKitt>それでも、主な問題は逆算していることです。コードをクリーンアップすると、多くの場合、行が少なくなります。削除されたコードを説明するために残りのコードに負担をかけるオーバーヘッドを手動で試みることはできますが、そもそも価格全体を推測するよりも良い方法がわかりません。
スペクトル

10

wcコマンドが複数の引数を取ることができ、あなただけにすべてのファイル名を渡すことができますwc使用して+の引数-execGNUのアクションをfind

find . -type f -name '*.[ch]' -exec wc -l {} +

または、bashシェルオプションglobstarを使用して、ディレクトリを再帰的に走査します。

shopt -s globstar
wc -l **/*.[ch]

他のシェルは、デフォルトで再帰的にトラバースします(例:)、zshまたはのような同様のオプションがありますglobstar


1
ルートがないマシンに非標準のソフトウェアをインストールする必要がないため、+ 1
Bamboomy

5

find一緒に使用できます:xargswc

find . -type f -name '*.h' -o -name '*.c' | xargs wc -l

2
(つまり、ファイルパスに空白、改行、単一引用符、しかしバックスラッシュ文字の二重引用符が含まれていないと仮定しそれはまた出力いくつかあります。total行は、いくつかの場合にはwcsが呼び出されている。)
ステファンChazelas

おそらく、いくつかのwcコマンドの問題はfindwhile read FILENAME; do . . .done構造へのパイプによって対処できます。そしてwhileループ内で使用しますwc -l。残りは合計行を合計して変数にし、表示します。
セルギーKolodyazhnyy

5

clocなどにアクセスできない環境にいる場合は、お勧めします

find -name '*.[ch]' -type f -exec cat '{}' + | grep -c '[^[:space:]]'

Run-through:find名前が.corで終わるすべての通常ファイルを再帰的に検索して.h実行catします。出力はgrep、すべての非空白行(少なくとも1つの非スペース文字を含む行)をカウントするためにパイプ処理されます。


4

コメントで指摘されているように、前者は数字のみを印刷し、後者は数字とファイル名を印刷するため、同等でcat file | wc -lはありませんwc -l file。同様に、各ファイルの情報の行を印刷するのcat * | wc -lに対し、数字だけwc -l *を印刷します。

シンプルさの精神で、実際に尋ねられた質問をもう一度見てみましょう。

コードの行を数えたい場合、些細なことは

cat *.c *.h | wc -l

しかし、複数のサブディレクトリがある場合はどうなりますか?

まず、些細なコマンドでも次のように単純化できます。

cat *.[ch] | wc -l

最後に、多くのサブディレクトリに相当するものは次のとおりです。

find . -name '*.[ch]' -exec cat {} + | wc -l

これは、おそらく、このような追加することによってのみ、通常のファイル(ディレクトリではない)にマッチしたファイルを制限するなど、多くの方法で改善される可能性が-type f与えられたブタfindのコマンドがあり、正確なの再帰的同等cat *.[ch]


3

を使用したサンプルawk

find . -name '*.[ch]' -exec wc -l {} \; |
  awk '{SUM+=$1}; END { print "Total number of lines: " SUM }'

+代わりに使用し\;ます。
ジョナサンレフラー

@JonathanLefflerなんで?
ハスター

1
@Hastur:それは走るwc -lというように、ファイルのグループのためにxargs行いますが、それはどちらか必要とせずに、ファイル名に(スペースのような)奇数ボールの文字を処理しxargsたり(非標準)-print0および-0オプションへfindxargsそれぞれ。それはマイナーな最適化です。欠点はwc、複数のファイルが指定されたときに、の各呼び出しが最後に合計行数を出力するawkことです。スクリプトはそれを処理します。したがって、それはスラムダンクではありませんが、非常によく、withの+代わりに使用することをお勧めします。\;find
ジョナサンレフラー

@JonathanLefflerありがとうございます。同意する。しかし、私の懸念は、に渡されるパラメータ文字列の長さに関するものでしたwc事前に不明ファイルが見つかった場合、その制限を超えるリスクがありますか、それとも何らかの方法でfindによって処理されますか?
ハスター

2
@Hastur:findファイルをプラットフォーム上の引数リストの長さの制限を超えない便利なサイズのバンドルにグループ化し、環境(引数リストの長さから生じる-引数リストの長さ+環境の長さは最大値未満でなければなりません)。IOW findは仕事の権利をxargs果たします。仕事の権利も同様です。
ジョナサンレフラー

1

簡単なコマンド:

find . -name '*.[ch]' | xargs wc -l

(つまり、ファイルパスに空白、改行、単一引用符、しかしバックスラッシュ文字の二重引用符が含まれていないと仮定しそれはまた出力いくつかあります。total行は、いくつかの場合にはwcsが呼び出されている。)
ステファンChazelas

0

Linuxを使用している場合は、独自のツールpolyglotをお勧めします。これはcloc、よりも劇的に高速で、機能が豊富ですsloccount

提供されているバイナリはありませんが、BSD上でもビルドできるはずです。

あなたはそれを呼び出すことができます

poly .

-2

find . -name \*.[ch] -print | xargs -n 1 wc -lトリックを行う必要があります。同様に-exec、出力をにパイプする代わりにを使用するなど、いくつかのバリエーションがありますwc


4
ただしfind . -name \*.[ch] -print、ファイルの内容は印刷せず、ファイル名のみを印刷します。代わりに、ファイルの数を数えますか?`xargs 'が必要ですか?
ニクラスローゼンクランツ

@ Programmer400はい、必要です。また、多数のファイルがある場合はxargs、複数のwc呼び出しを監視する必要があります。すべてのtotal行を探して合計する必要があります。
スティーブンキット

合計行数だけが必要な場合は、行う必要がありますfind . -name \*.[ch] -print0 | xargs -0 cat | wc -l
ふわふわ

この(find . -name \*.[ch] -print | wc -l)はファイルの数をカウントすることに注意してください(ファイル名に改行が含まれている場合を除きますが、それは非常に珍しいことです)。ファイル内の行数はカウントしません。
ジョナサンレフラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.