回答:
試してください:
find . -name '*.php' | xargs wc -l
SLOCCountツールも役立ちます。
それはあなたがそれを指しているどんな階層のためのコードカウントの正確なソース行といくつかの追加の統計を与えます。
ソートされた出力:
find . -name '*.php' | xargs wc -l | sort -nr
find . -name '*.php' -o -name '*.inc' | xargs wc -l
wc
。複数回実行されます。また、多くの特殊ファイル名を処理しません
find . -name "*.php" -not -path "./tests*" | xargs wc -l
別のワンライナーの場合:
( find ./ -name '*.php' -print0 | xargs -0 cat ) | wc -l
スペースを含む名前で機能し、1つの数値のみを出力します。
man find
..を参照してください。xargs- 0を指定したprint0を使用すると、名前にスペースまたはその他の奇妙な文字が含まれるファイルを操作できます
( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
最近のバージョンのBash(またはZSH)を使用している場合は、はるかに簡単です。
wc -l **/*.php
Bashシェルでは、このglobstar
オプションを設定する必要があります。それ以外の場合、**
glob-operatorは再帰的ではありません。この設定を有効にするには、
shopt -s globstar
これは永続的なものにするには、初期化ファイルの1(に追加~/.bashrc
、~/.bash_profile
など)。
wc -l **/*.[ch]
は合計15195373行を検出します。それが「非常に低い値」であると考えるかどうかわかりません。ここでも、globstar
Bashで有効になっていることを確認する必要があります。で確認できshopt globstar
ます。明示的に有効にするには、を実行しますshopt -s globstar
。
ARG_MAX
多数の.php
ファイルがある場合でもオーバーフローしますwc
。
find
スペースが含まれている場合、受け入れられた回答は失敗します。これは、それぞれとを使用print0
し--null
て修正することができます。find
xargs
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
-------------------------------------------------------------------------------
cloc
は単なるPerlスクリプトなので、この質問の冒頭を編集して、クロスプラットフォームであることを明確にしてみませんか?
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
-------------------------------------------------------------------------------
そこにファイルがいくつあるか、または何が望ましい出力であるかを指定しませんでした。これはあなたが探しているものですか?
find . -name '*.php' | xargs wc -l
go () { mkdir /tmp/go; [[ -f ./"$1" ]] && mv ./"$1" /tmp/go; (find ./ -type f -name "$*" -print0 | xargs -0 cat ) | wc -l; wc -l /tmp/go/*; mv /tmp/go/* . }
結果が近いためslocountでした*.py
が、それは知りませんでした*.js
、*.html
。
さらに別のバリエーション:)
$ find . -name '*.php' | xargs cat | wc -l
編集:ファイルごとではなく、合計が表示されます。
Edit2:後で追加.
しfind
て機能させる
$ find -name \*\.php -print0 | xargs -0 cat | wc -l
find . -name '*.php' | xargs cat | wc -l
を提供します:...これはファイルfind . -name '*.php' | xargs wc -l
驚いたことに、find -exec
とに基づく回答はありませんawk
。さあ行こう:
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; }'
find . -name '*.c' -print0 |xargs -0 wc -l
。とは言うものの、このより高速な方法(少なくともOS Xでは)は「合計」を数回出力するため、適切な合計を取得するには追加のフィルタリングが必要です(詳細は回答に投稿しました)。
wc
aの形式で1つを実行するcat
と、システムが最初にすべてのGBを処理して行のカウントを開始する必要があるため、遅いです(200GBのjson、12kファイルでテスト)。wc
最初に実行してから結果をカウントする方がはるかに高速です
find . -type f -exec wc -l {} \+
または find . -name '*.py' -type f -exec wc -l {} \+
、出力の最後に合計を出力します。興味があるのが合計だけの場合は、少し先に進んで使用することもできますtail
。 find . -type f -exec wc -l {} \+ | tail -1
またはfind . -name '*.py' -type f -exec wc -l {} \+ | tail -1
私の場合より一般的で単純ですが、異なる名前拡張子のファイルを数える必要があるとしましょう(たとえば、ネイティブも)
wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )
フィードバックをありがとう、私はそれを修正しました。
$()
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
ディレクトリ内のコード行をカウントするsloccountと呼ばれる小さなツールがあります。空の行/コメントを無視し、プログラミング言語ごとに結果をグループ化し、いくつかの統計を計算するため、必要以上のことを行うことに注意してください。
あなたが欲しいのは単純なfor
ループです:
total_count=0
for file in $(find . -name *.php -print)
do
count=$(wc -l $file)
let total_count+=count
done
echo "$total_count"
xargs
か?
IFS=$'\n'
ループの前に設定すると、名前に改行が含まれるファイルを除いて、少なくともそれを修正します。第二に、あなたはクォート'*.php'
ではないので、シェルでは展開されずに展開されますfind
、そしてエルゴは実際にはサブディレクトリでphpファイルを見つけません。また、-print
他のアクションがない場合に暗黙的に指定されるため、これは冗長です。
ソースのみ:
wc `find`
フィルタリングするには、grepを使用します
wc `find | grep .php$`
高速で、find
ファイルの数が多すぎる(数値引数がオーバーフローしている)場合でも失敗せず、のすべての検索/フィルタリング機能を使用しxargs
、名前に変な記号が含まれているファイルを正常に処理し、を使用しないと、外部コマンド(に感謝の無駄に高い数+
のためfind
の-exec
)。どうぞ:
find . -name '*.php' -type f -exec cat -- {} + | wc -l
\;
代わりに+
、私はそれに気づいていなかったとして)、この答えが正解でなければなりません。
質問にタグが付けられていることを知っています バッシュ、しかしあなたが解決しようとしている問題は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
ご覧のように、提供される情報は、プロジェクトの作業を開始する前に、プロジェクトの複雑さを大まかに把握できるため、開発者の観点から見るとはるかに役立ちます。
誰もこれが奥に埋もれているのを見ることはないと思います...しかし、これまでのところ、ファイル名にスペースが含まれているという問題については、答えはありません。さらに、xargs
ツリー内のパスの全長がシェル環境のサイズ制限(Linuxではデフォルトで数メガバイト)を超えると、すべての使用が失敗する可能性があります。これらはかなり直接的な方法でこれらの問題を修正するものです。サブシェルはスペースを含むファイルを処理します。awk
個々のファイルwc
出力のストリームの合計なので、スペースが不足することはありません。また、exec
ファイルのみに制限します(ディレクトリをスキップします)。
find . -type f -name '*.php' -exec bash -c 'wc -l "$0"' {} \; | awk '{s+=$1} END {print s}'
WC -L?GREP -Cを使用することをお勧めします^
wc -l?違う! wcコマンドは、行ではなく新しい行コードをカウントします!ファイルの最後の行が新しい行コードで終わっていない場合、これはカウントされません!
それでもcount行が必要な場合は、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トラップに注意してください (カウントではなく、行に入ります!!!)
find -type f -name '*.php' -print0 | xargs -0 grep -ch ^ | paste -sd+ - | bc
代替手段については、こちらを参照してくださいbc
:stackoverflow.com/q/926069/2400328
非常に簡単に
find /path -type f -name "*.php" | while read FILE
do
count=$(wc -l < $FILE)
echo "$FILE has $count lines"
done
結果を行数でソートしたい場合は、次のように最初の回答に| sort
or | sort -r
(-r
降順)を追加します。
find . -name '*.php' | xargs wc -l | sort -r
xargs wc -l
は数値なので、実際にはsort -n
or を使用する必要がありますsort -nr
。
以下のためのWindows、簡単かつ迅速なツールですLocMetrics。
何か違います:
wc -l `tree -if --noreport | grep -e'\.php$'`
これは罰金を動作しますが、あなたは、少なくとも一つ持っている必要があり*.php
、現在のフォルダ内のファイルやサブフォルダの1、または他のwc
屋台を
Linuxを使用している場合は(私もそうです)、私のツールpolyglotをお勧めします。sloccount
またはよりも劇的に高速で、cloc
より機能的ですsloccount
。
あなたはそれを呼び出すことができます
poly .
または
poly
そのため、複雑なbashスクリプトよりもはるかにユーザーフレンドリーです。
ツールTokeiは、ディレクトリ内のコードに関する統計を表示します。Tokeiは、ファイル数、ファイル内の合計行数、コード、コメント、および空白を言語別にグループ化して表示します。トケイは、Mac、Linux、Windowsでもご利用いただけます。
Tokeiの出力の例は次のとおりです。
$ tokei
-------------------------------------------------------------------------------
Language Files Lines Code Comments Blanks
-------------------------------------------------------------------------------
CSS 2 12 12 0 0
JavaScript 1 435 404 0 31
JSON 3 178 178 0 0
Markdown 1 9 9 0 0
Rust 10 408 259 84 65
TOML 3 69 41 17 11
YAML 1 30 25 0 5
-------------------------------------------------------------------------------
Total 21 1141 928 101 112
-------------------------------------------------------------------------------
リポジトリ内のREADMEファイルの指示に従って、 Tokeiをインストールできます。
GnuWin32がインストールされていれば、Windowsでも非常に単純な1行のコマンドを使用できます。このような:
cat `/gnuwin32/bin/find.exe . -name *.php` | wc -l
find.exeの場所を正確に指定する必要があります。指定しない場合、Windowsが提供するFIND.EXE(古いDOSのようなコマンドから)が実行されます。これは、環境PATHのGnuWin32の前であり、パラメーターと結果が異なるためです。
上記のコマンドでは、単一引用符ではなく逆引用符を使用する必要があることに注意してください。
シンプルにしたい場合は、仲介者を切り取りwc
、すべてのファイル名を指定して呼び出します。
wc -l `find . -name "*.php"`
または、現代の構文では:
wc -l $(find . -name "*.php")
ディレクトリ名またはファイル名にスペースが含まれていない限り、機能します。そして、あなたが数万のファイルを持っていない限り(現代のシェルは本当に長いコマンドラインをサポートしています)。プロジェクトには74個のファイルがあるため、拡張する余地は十分にあります。
wc -l `find . -type f \( -name "*.cpp" -o -name "*.c" -o -name "*.h" \) -print`
これらすべての複雑で覚えにくいコマンドは必要ありません。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
そして、このツールの最高の部分は、あなたが追加できることです .gitignore
設定ファイルのようにことです。「.gitignore」で行うのと同じように、カウントするファイルの種類を選択または無視するルールを設定できます。
詳細と使用法はこちら:https : //github.com/MorganZhang100/line-counter