web-dev-qa-db-ja.com

ディレクトリ内のすべてのコード行を再帰的に数える方法は?

PHPアプリケーションがあり、特定のディレクトリとそのサブディレクトリの下にあるすべてのコード行を数えます。大まかなアイデアを得ようとしているだけなので、コメントを無視する必要はありません。

wc -l *.php 

このコマンドは特定のディレクトリ内ではうまく機能しますが、サブディレクトリは無視されます。私はこれでうまくいくと思っていましたが、74が返されています。

find . -name '*.php' | wc -l

すべてのファイルに入力する正しい構文は何ですか?

1435
user77413

試してください:

find . -name '*.php' | xargs wc -l

SLOCCountツールも役に立ちます。

それはあなたがそれを指すどんな階層についてのコードカウントの正確なソース行と、いくつかの追加の統計を与えるでしょう。

2340
Peter Elespuru

他のワンライナーの場合:

( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l

スペースを含む名前に対して機能し、1つの数字のみを出力します。

420
Shizzmo

かなり最近のバージョンのBash(またはZSH)を使用している場合は、はるかに簡単です。

wc -l **/*.php

Bashシェルではglobstarオプションを設定する必要があります。そうでなければ** glob-operatorは再帰的ではありません。この設定を有効にするには、

shopt -s globstar

これを永続的なものにするには、それを初期化ファイルの1つ(~/.bashrc~/.bash_profileなど)に追加します。

363
Michael Wild

この目的のために構築された cloc ユーティリティを使用できます。各言語の行数、コメント数などを報告します。CLOCは、Linux、Mac、およびWindowsで使用できます。

使用方法と出力例

$ cloc --exclude-lang=DTD,Lua,make,Python .
    2570 text files.
    2200 unique files.                                          
    8654 files ignored.

http://cloc.sourceforge.net v 1.53  T=8.0 s (202.4 files/s, 99198.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                    1506          77848         212000         366495
CSS                             56           9671          20147          87695
HTML                            51           1409            151           7480
XML                              6           3088           1383           6222
-------------------------------------------------------------------------------
SUM:                          1619          92016         233681         467892
-------------------------------------------------------------------------------
264
simao

UNIX系システムでは、コード統計を提供するclocというツールがあります。 

私は私達のコードベースでそれが言うランダムなディレクトリに走りました:

      59 text files.
      56 unique files.                              
       5 files ignored.

http://cloc.sourceforge.net v 1.53  T=0.5 s (108.0 files/s, 50180.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               36           3060           1431          16359
C/C++ Header                    16            689            393           3032
make                             1             17              9             54
Teamcenter def                   1             10              0             36
-------------------------------------------------------------------------------
SUM:                            54           3776           1833          19481
-------------------------------------------------------------------------------
91
Calmarius

ファイルの数や希望する出力を指定しませんでした。

find . -name '*.php' | xargs wc -l
32
Paweł Polewicz

さらに別のバリエーション:)

$ find -name '*.php' | xargs cat | wc -l

編集:これはファイルごとではなく、合計を表示します。

21

_ posix _

ここにある他のほとんどの答えとは異なり、これらはあらゆるPOSIXシステム、あらゆる数のファイル、あらゆるファイル名で機能します(注記がない限り)。


各ファイルの行

find . -name '*.php' -type f -exec wc -l {} \;
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} +

ファイルパスでソートされた各ファイル内の行

find . -name '*.php' -type f | sort | xargs -L1 wc -l
# for files with spaces or newlines, use the non-standard sort -z
find . -name '*.php' -type f -print0 | sort -z | xargs -0 -L1 wc -l

各ファイルの行数、降順で行数でソート

find . -name '*.php' -type f -exec wc -l {} \; | sort -nr
# faster, but includes total at end if there are multiple files
find . -name '*.php' -type f -exec wc -l {} + | sort -nr

全ファイルの総行数

find . -name '*.php' -type f -exec cat {} + | wc -l
20
Paul Draper

私にとってはより一般的で単純な、異なる名前拡張子のファイルをカウントする必要があるとします(たとえば、ネイティブファイルも)。

wc `find . -name '*.[h|c|cpp|php|cc]'`
18
sergeych

sloccount というディレクトリ内のコード行を数えるための小さなツールがあります。空の行/コメントを無視し、プログラミング言語ごとに結果をグループ化し、いくつかの統計を計算するので、必要以上に機能します。

17
sebasgo

驚くべきことに、findの-execawkに基づく答えはありません。さあ:

find . -type f -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'

このスニペットはすべてのファイル(-type f)を検索します。ファイル拡張子で検索するには、-nameを使用します。

find . -name *.py -exec wc -l {} \; | awk '{ SUM += $0} END { print SUM }'
16
jonhattan

ソースのみの場合:

wc `find`

フィルタリングするには、grepを使う

wc `find | grep .php$`
11
kekszumquadrat

速くて簡単なものは、findの検索/フィルタリング能力をすべて使いますが、ファイルが多すぎても失敗せず(数字の引数がオーバーフローします)、xargsを使わなくても名前におかしな記号があるファイルでうまく動作します(find+に対する-execのおかげで)無用に多数の外部コマンドを起動します。どうぞ:

find . -name '*.php' -type f -exec cat -- {} + | wc -l
11
gniourf_gniourf

あなたが欲しいのは単純なforループです:

total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo "$total_count"
11
ennuikiller

誰もがこれが後ろに埋もれているのを見たことがないでしょう…それでも、これまでのところ答えのどれもファイル名のスペースの問題にたどり着きません。さらに、ツリー内のパスの合計長がシェル環境のサイズ制限(Linuxではデフォルトの数メガバイト)を超えると、xargsを使用するものすべてが失敗する可能性があります。これはかなり直接的な方法でこれらの問題を解決するものです。サブシェルは、スペースのあるファイルを扱います。 awkは、個々のファイルのwc出力のストリームを合計するので、絶対にスペースを使い果たすべきではありません。また、execをファイルのみに制限します(ディレクトリをスキップします)。

find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}' 
8
Gene

質問に bash のタグが付けられているのはわかりますが、解決しようとしている問題もPHPに関連しているようです。

Sebastian Bergmannが _ phploc _ というツールを作成しました。これを使用すると、プロジェクトの複雑さの概要を知ることができます。これはそのレポートの例です。

Size
  Lines of Code (LOC)                            29047
  Comment Lines of Code (CLOC)                   14022 (48.27%)
  Non-Comment Lines of Code (NCLOC)              15025 (51.73%)
  Logical Lines of Code (LLOC)                    3484 (11.99%)
    Classes                                       3314 (95.12%)
      Average Class Length                          29
      Average Method Length                          4
    Functions                                      153 (4.39%)
      Average Function Length                        1
    Not in classes or functions                     17 (0.49%)

Complexity
  Cyclomatic Complexity / LLOC                    0.51
  Cyclomatic Complexity / Number of Methods       3.37

ご覧のとおり、提供される情報は開発者の観点から見るとはるかに有用です。なぜなら、プロジェクトを始める前にプロジェクトがどれほど複雑であるかをおおまかに言っているからです。

7
Ja͢ck

トイレ - L? GREP -C ^を使ってください

トイレ-l? 間違っています wcコマンドは新しい行コードをカウントします、not lines!ファイルの最後の行が改行コードで終わらない場合、これはカウントされません!

それでもカウント行が必要な場合は、grep -c ^を使用してください。

#this example prints line count for all found files
total=0
find /path -type f -name "*.php" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     echo "$FILE has $count lines"
     let total=total+count #in bash, you can convert this for another Shell
done
echo TOTAL LINES COUNTED:  $total

最後に、wc -l trap (カウントは入りますが、行ではありません!!!)に注意してください

5
Znik

Zsh globを使えばとても簡単です。

wc -l ./**/*.php

Bashを使っているのなら、アップグレードするだけです。 bashを使う理由は絶対にありません。

4
HappyFace

結果を行数でソートしたい場合は、次のように最初の答えに| sortまたは| sort -r(降順の場合は-r)を追加するだけです。

find . -name '*.php' | xargs wc -l | sort -r
4
Paul Pettengill

何か違います:

wc -l `tree -if --noreport | grep -e'\.php$'`

これはうまくいきますが、現在のフォルダまたはそのサブフォルダのいずれかに少なくとも1つの*.phpファイルが必要です。それ以外の場合はwc stalls

4
nav

総行数だけが必要な場合は、PHPファイルを例にしてみましょう。GnuWin32がインストールされていれば、Windowsでも非常に単純な1行のコマンドを使用できます。このような:

cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l

そうでなければWindowsが提供するFIND.EXE(古いDOS風コマンドから)が実行されることになるでしょう。それはおそらく環境PATHのGnuWin32の前であり、異なるパラメータと結果を持っているからです。

上記のコマンドでは、一重引用符ではなく逆引用符を使用してください。

3
Neven Boyanov

最長のファイルを最初に配布する(つまり、これらの長いファイルにはリファクタリングが必要ですか?)。ただし、ベンダーのディレクトリを除外するには

 find . -name '*.php' | xargs wc -l | sort -nr | egrep -v "libs|tmp|tests|vendor" | less
3
Matt

Windows の場合、簡単で迅速なツールはLocMetricsです。

3
walv

私はそれがまた合計として限りファイルごとの要約を示すので私がこれを好むスクリプトを好むが

wc -l `find . -name "*.php"`
2
akiva

空白行を除く 

find . -name "*.php" | xargs grep -v -c '^$' | awk 'BEGIN {FS=":"} { $cnt = $cnt + $2} END {print $cnt}'

空白行を含める:

find . -name "*.php" | xargs wc -l
2

あなたはこれらの複雑で覚えにくいコマンドをすべて必要としません。 line-counter というツールが必要です。

簡単な概要

これはあなたがツールを取得する方法です

$ pip install line-counter

lineコマンドを使用して、現在のディレクトリのファイル数と行数を取得する(再帰的)

$ line
Search in /Users/Morgan/Documents/Example/
file count: 4
line count: 839

もっと詳細を知りたい場合は、line -dを使用してください。

$ line -d
Search in /Users/Morgan/Documents/Example/
Dir A/file C.c                                             72
Dir A/file D.py                                           268
file A.py                                                 467
file B.c                                                   32
file count: 4
line count: 839

そしてこのツールの最も良いところはconfigureファイルのような.gitignoreをそれに追加できることです。 '。gitignore'で実行したのと同じように、どの種類のファイルをカウントするかを選択または無視するようにルールを設定できます。

より多くの説明と用法はここにあります: https://github.com/MorganZhang100/line-counter

2
Morgan Zhang

少なくともOS Xでは、他のいくつかの答えにリストされているfind + xarg + wcコマンドは大きなリストに "total"を数回印刷しますが、完全な合計はありません。次のコマンドを使用して、.cファイルの合計を1つ取得することができました。

find . -name '*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print "SUM: " sum; }'

2
Doug Richardson

もしあなたがそれを単純にしたいのなら、仲介者を切り出して、wcをすべてのファイル名で呼び出してください。

wc -l `find . -name "*.php"`

または現代の構文では:

wc -l $(find . -name "*.php")

ディレクトリ名またはファイル名のいずれにもスペースがない限り機能します。そしてあなたが何万ものファイルを持っていない限り(現代のシェルは本当に長いコマンドラインをサポートします)。あなたのプロジェクトは74ファイルを持っているので、あなたは成長する余地が十分にあります。

2
alexis

もしあなたがLinuxを使っているなら(そして私はあなたがそうであると思う)、私は私のツール polyglot をお勧めします。 sloccountclocよりも劇的に速く、sloccountよりも機能的です。 

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

poly .

または

poly

そのため、複雑なbashスクリプトよりもはるかにユーザーフレンドリーです。

2
user8174234

Src-projectのディレクトリから起動したこのインラインスクリプトを使用しました。

 for i in $(find . -type f); do rowline=$(wc -l $i | cut -f1 -d" "); file=$(wc -l $i | cut -f2 -d" "); lines=$((lines + rowline)); echo "Lines["$lines"] " $file "has "$rowline"rows."; done && unset lines

それはこの出力を作り出します:

Lines[75]  ./Db.h has 75rows.
Lines[143]  ./Db.cpp has 68rows.
Lines[170]  ./main.cpp has 27rows.
Lines[294]  ./Sqlite.cpp has 124rows.
Lines[349]  ./Sqlite.h has 55rows.
Lines[445]  ./Table.cpp has 96rows.
Lines[480]  ./DbError.cpp has 35rows.
Lines[521]  ./DbError.h has 41rows.
Lines[627]  ./QueryResult.cpp has 106rows.
Lines[717]  ./QueryResult.h has 90rows.
Lines[828]  ./Table.h has 111rows.
2
Luca Davanzo

私は複数のファイルタイプをチェックしたかったので、合計を手動で計算するのが面倒でした。だから私は今これを使って合計を一度に取得します。

find . -name '*.js' -or -name '*.php' | xargs wc -l | grep 'total'  | awk '{ SUM += $1; print $1} END { print "Total text lines in PHP and JS",SUM }'

79351
15318
PHPおよびJS 94669の合計テキスト行

これにより、フィルタリングしたい複数の拡張子タイプを連鎖させることができます。 -name '*.js' -or -name '*.php'の部分にそれらを追加し、そしておそらくあなたの好みにotuputメッセージを修正

1
Tschallacka

最初に行数を知りたいディレクトリを変更してください。たとえば、sampleという名前のディレクトリのすべてのファイルに含まれる行数を知りたくない場合。 $cd sampleを与えます。それからコマンド$wc -l *を試してください。これは各ファイルの行数と、最後にディレクトリ全体の合計行数を返します

1
venky513

すべてのファイルの合計を取得するためのさらに別のコマンド

find ./ -type f -exec wc -l {}  \; | cut -d' ' -f1 | paste -sd+ | bc

他の答えとの主な違い: 

  1. find -exec を使用します。 
  2. 貼り付け(カットあり) 、 
  3. bc を使用 
1
AJed
$cd directory
$wc -l* | sort -nr
1
sree

非常に簡単に

find /path -type f -name "*.php" | while read FILE
do
    count=$(wc -l < $FILE)
    echo "$FILE has $count lines"
done
1
ghostdog74

私は私のwindowsシステムにインストールされているbusy boxを持っています。だからここに私がしたことがあります。

ECHO OFF
for /r %%G in (*.php) do (
busybox grep . "%%G" | busybox wc -l
) 
1
shyam

私はこのようにします:

これがlineCount.cファイルの実装です。

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 

int getLinesFromFile(const char*);

int main(int argc, char* argv[]) {
   int total_lines = 0; 
   for(int i = 1; i < argc; ++i) {
       total_lines += getLinesFromFile(argv[i]); // *argv is a char*        
   }    

   printf("You have a total of %d lines in all your file(s)\n",    total_lines);
   return 0;
}


int getLinesFromFile(const char* file_name) {
    int lines = 0;
    FILE* file;
    file = fopen(file_name, "r");
    char c = ' ';
    while((c=getc(file)) != EOF) if(c == '\n') ++lines;
    fclose(file);   
    return lines;
}

次にコマンドラインを開きます。

そしてgcc lineCount.cと入力し、次に./a.out *.txt と入力します。これにより、ディレクトリ内の.txtで終わるファイルの合計行が表示されます。

1
Moshe Rabaev

Shizzmo's answer に似ていますが、くて正確です。頻繁に使用する場合は、それに合わせて変更し、スクリプトに入れてください。

この例:

  1. 自分のコードではないパスを適切に除外します(findが全探索しない)
  2. 複合拡張子や無視したい他のファイルを除外します
  3. 指定したタイプの実際のファイルのみが含まれます
  4. 空白行を無視します
  5. 合計として単一の数値を与える
find . \! \( \( -path ./lib -o -path ./node_modules -o -path ./vendor -o -path ./any/other/path/to/skip -o -wholename ./not/this/specific/file.php -o -name '*.min.js' -o -name '*.min.css' \) -Prune \) -type f \( -name '*.php' -o -name '*.inc' -o -name '*.js' -o -name '*.scss' -o -name '*.css' \) -print0 | xargs -0 cat | grep -v '^$' | wc -l
0
Walf

古いPython(少なくともPython 2.6で動作する)を使用して、@ Shizzmoの素敵な1つのライナーを組み込んだ柔軟なものです。 typesリストに、ソースフォルダーでカウントするファイルタイプを入力するだけです。

#!/usr/bin/python

import subprocess

rcmd = "( find ./ -name '*.%s' -print0 | xargs -0 cat ) | wc -l"
types = ['c','cpp','h','txt']

sum = 0
for el in types:
    cmd = rcmd % (el)
    p = subprocess.Popen([cmd],stdout=subprocess.PIPE,Shell=True)
    out = p.stdout.read().strip()
    print "*.%s: %s" % (el,out)
    sum += int(out)
print "sum: %d" % (sum)
0
fyngyrz

ファイルが多すぎる場合は、合計行数を調べるほうがよいでしょう。

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'
0
bharath
cat \`find . -name "*.php"\` | wc -l
0

私は別のOS Xエントリを追加することもできます。これはexecで普通のfindを使用します(これまでxargsを使った非常に大きなfind結果セットからの奇妙な結果を見たのでxargsを使うよりも好ましい)これはOS X用なので、フィルタリングで.hまたは.mファイルにも追加しました。最後までコピーしてください。 

find ./ -type f -name "*.[mh]" -exec wc -l {}  \; | sed -e 's/[ ]*//g' | cut -d"." -f1 | paste -sd+ - | bc