如何递归计算目录中的所有代码行?

我们有一个PHP应用程序,想要计算特定目录及其子目录下的所有代码行。

我们不需要忽略评论,因为我们只是想得到一个粗略的想法。

wc -l *.php

该命令适用于给定目录,但它忽略子目录。我在想下面的注释可能会起作用,但它返回74,这绝对不是这种情况…

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

从一个目录中重新输入所有文件的正确语法是什么?

1031040 次浏览

您没有指定有多少个文件或所需的输出是什么。

这可能是你正在寻找的:

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

尝试:

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

或(当文件名包含空格等特殊字符时)

find . -name '*.php' | sed 's/.*/"&"/' | xargs  wc -l

SLOCCount工具也有帮助。

它将提供准确的源代码行计数你指向的层次结构,以及一些额外的统计数据。

排序输出:

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

你想要一个简单的for循环:

total_count=0for file in $(find . -name *.php -print)docount=$(wc -l $file)let total_count+=countdoneecho "$total_count"

有一个名为的loc计数的小工具可以计算目录中的代码行。

应该注意的是,它做的比你想要的更多,因为它忽略了空行/注释,对每种编程语言的结果进行分组并计算一些统计数据。

对于另一个单行:

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

它适用于带有空格的名称,并且只输出一个数字。

非常简单:

find /path -type f -name "*.php" | while read FILEdocount=$(wc -l < $FILE)echo "$FILE has $count lines"done
cat \`find . -name "*.php"\` | wc -l

如果您只需要PHP文件中的总行数,那么即使在安装了GnuWin32的Windows下,您也可以使用非常简单的一行命令。像这样:

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

您需要指定find.exe的确切位置,否则将执行Windows提供的FIND.EXE(来自旧的类似DOS的命令),因为它可能在环境PATH中的GnuWin32之前并且具有不同的参数和结果。

请注意,在上面的命令中,您应该使用反引号,而不是单引号。

您可以使用为此目的而构建的#0实用程序。它报告每种语言的行数,以及其中有多少是注释等。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         366495CSS                             56           9671          20147          87695HTML                            51           1409            151           7480XML                              6           3088           1383           6222-------------------------------------------------------------------------------SUM:                          1619          92016         233681         467892-------------------------------------------------------------------------------

另一种变化:)

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

这将给出总和,而不是一个文件一个文件。

find之后添加.以使其工作。

仅供来源:

wc `find`

要过滤,只需使用grep

wc `find | grep .php$`

对我来说更常见和简单,假设您需要计算不同名称扩展名的文件(例如,也是本地人):

wc $(find . -type f | egrep "\.(h|c|cpp|php|cc)" )

如果你想让你的结果按行数排序,你可以在第一个答案中添加| sort| sort -r-r为降序),如下所示:

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

不同的东西:

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

这可以正常工作,但您需要在当前文件夹或其子文件夹中至少有一个*.php文件,否则#1会停止。

如果使用最新版本的Bash(或ZSH),它会简单得多:

wc -l **/*.php

在Bash shell中,这需要设置globstar选项,否则**全球运算符不是递归的。要启用此设置,请发出

shopt -s globstar

要使其永久化,请将其添加到其中一个初始化文件(~/.bashrc~/.bash_profile等)中。

使用找到-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; }'

首先给出最长的文件(即。也许这些长文件需要一些重构的爱?),并排除一些供应商目录:

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

最好使用GREP-C^

wc -l错了!

wc命令计算新行代码,没有行!当文件中的最后一行没有以新行代码结束时,这不会被计算在内!

如果您仍然想要计数行,请使用grep-c^。完整示例:

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

最后,小心wc -l陷阱(计数进入,而不是行!!!)

一个简单的快速,将使用find的所有搜索/过滤功能,当文件太多时不会失败(数字参数溢出),可以很好地处理名称中带有有趣符号的文件,而不使用xargs,并且不会启动无用的大量外部命令(感谢find-exec+)。在这里你去:

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

我已经在我的Windows系统上安装了BusyBox

ECHO OFFfor /r %%G in (*.php) do (busybox grep . "%%G" | busybox wc -l)

我知道这个问题被标记为,但似乎您试图解决的问题也与PHP相关。

Sebastian Bergmann编写了一个名为PHPLOC的工具,它可以满足您的需求,并在此基础上为您提供项目复杂性的概述。这是其报告的一个示例:

SizeLines of Code (LOC)                            29047Comment 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                          29Average Method Length                          4Functions                                      153 (4.39%)Average Function Length                        1Not in classes or functions                     17 (0.49%)
ComplexityCyclomatic Complexity / LLOC                    0.51Cyclomatic Complexity / Number of Methods       3.37

如您所见,从开发人员的角度来看,提供的信息要有用得多,因为它可以大致告诉您在开始使用项目之前项目有多复杂。

在类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          16359C/C++ Header                    16            689            393           3032make                             1             17              9             54Teamcenter def                   1             10              0             36-------------------------------------------------------------------------------SUM:                            54           3776           1833          19481-------------------------------------------------------------------------------

至少在OS X上,其他一些答案中列出的查找+xarg+wc命令在大型列表上多次打印“总计”,并且没有给出完整的总计。我能够使用以下命令获取. c文件的单个总计:

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

我使用了这个从源项目目录启动的内联脚本:

 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.

虽然我喜欢脚本,但我更喜欢这个,因为它还显示了每个文件的摘要,只要总数:

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

获取所有文件总和的另一个命令(当然Linux)

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

与其他答案的主要区别:

  1. 使用查找-exec
  2. 使用粘贴(带切割)
  3. 使用bc

对于windows,一个简单快捷的工具是局部度量

我也可以添加另一个OS X条目,这个使用普通的找到exec(我更喜欢使用xargs,因为我在过去看到过带有xargs的非常大的find结果集的奇怪结果)。

因为这是针对OS X的,所以我还在过滤中添加了. h或. m文件-确保一直复制到最后!

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

不包括空行:

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

包括空行:

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

到目前为止,没有一个答案解决了带空格的文件名问题。

此外,如果树中路径的总长度超过shell环境大小限制(Linux中默认为几兆字节),则所有使用xargs的路径都可能失败。

这是一个以非常直接的方式修复这些问题的方法。子shell负责处理有空格的文件。awk合计了单个文件wc输出的流,所以它应该永远不会耗尽空间。它还将exec限制为仅文件(跳过目录):

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

POSIX

与这里的大多数其他答案不同,它们适用于任何POSIX系统、任何数量的文件和任何文件名(除非另有说明)。


每个文件中的行:

find . -name '*.php' -type f -exec wc -l {} \;# faster, but includes total at end if there are multiple filesfind . -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 -zfind . -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 filesfind . -name '*.php' -type f -exec wc -l {} + | sort -nr

所有文件中的总行

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

如果您想保持简单,请去掉中间人并使用所有文件名调用wc

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

或者用现代语法:

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

只要目录名或文件名中没有空格,只要您没有数以万计的文件(现代shell支持非常长的命令行),这就可以工作。您的项目有74个文件,因此您有足够的发展空间。

我想检查多种文件类型,并且懒得手动计算总数。所以我现在使用这个来一次性获得总数。

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消息。

您不需要所有这些复杂且难以记住的命令。您只需要一个名为行计数器python工具。

快速概述

这就是你如何得到工具

$ pip install line-counter

使用line命令获取当前目录下的文件计数和行数(递归):

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

如果你想要更多的细节,只需使用line -d

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

这个工具最好的部分是,你可以向其中添加一个类似.gitignore的配置文件。你可以设置规则来选择或忽略要计数的文件类型,就像你在. gitignore中所做的那样。

更多描述和用法在这里:https://github.com/MorganZhang100/line-counter

首先更改要知道行数的目录。

例如,如果我想知道名为样本的目录中所有文件的行数,请给出$cd sample

然后尝试命令$wc -l *。这将返回每个文件的行数以及末尾整个目录中的总行数。

我是这样做的:

以下是线数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结尾的文件的总行。

如果你Linux(我认为你是),我推荐我的工具多语言。它比sloccountcloc快得多,比sloccount更有特色。

你可以用

poly .

poly

所以它比一些复杂的Bash脚本更用户友好。

使用z shell(zsh)全局很容易:

wc -l ./**/*.php

如果你使用的是Bash,你只需要升级就可以了。

如果文件太多,最好只查找总行数。

find . -name '*.php' | xargs wc -l | grep -i ' total' | awk '{print $1}'

类似于Shizzmo的回答,但更丑陋,更准确。如果你经常使用它,请修改它以适应并将其放入脚本中。

这个例子:

  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 -vcE '^[[:space:]]*$'

这是一个灵活的方法,使用较旧的Python(至少在Python 2.6中工作)并结合Shizzmo可爱的单线。只需在types列表中填写您想要在源文件夹中计数的文件类型,然后让它飞起来:

#!/usr/bin/python
import subprocess
rcmd = "( find ./ -name '*.%s' -print0 | xargs -0 cat ) | wc -l"types = ['c','cpp','h','txt']
sum = 0for 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)

如果你想计算你写的LOC,你可能需要排除一些文件。

对于Django项目,您可能希望忽略migrationsstatic文件夹。对于JavaScript项目,您可以排除所有图片或所有字体。

find . \( -path '*/migrations' -o -path '*/.git' -o -path '*/.vscode' -o -path '*/fonts' -o -path '*.png' -o -path '*.jpg' -o -path '*/.github' -o -path '*/static' \) -prune -o -type f -exec cat {} + | wc -l

这里的用法如下:

*/folder_name
file_extension

要列出文件,请修改命令的后一部分:

find . \( -path '*/migrations' -o -path '*/.git' -o -path '*/.vscode' -o -path '*/fonts' -o -path '*.png' -o -path '*.jpg' -o -path '*/.github' -o -path '*/static' \) -prune -o --print

工具Tokei显示有关目录中代码的统计信息。Tokei将显示文件数、这些文件中的总行以及按语言分组的代码、注释和空白。Tokei也可在Mac、Linux和Windows上使用。

Tokei的输出示例如下:

$ tokei-------------------------------------------------------------------------------Language            Files        Lines         Code     Comments       Blanks-------------------------------------------------------------------------------CSS                     2           12           12            0            0JavaScript              1          435          404            0           31JSON                    3          178          178            0            0Markdown                1            9            9            0            0Rust                   10          408          259           84           65TOML                    3           69           41           17           11YAML                    1           30           25            0            5-------------------------------------------------------------------------------Total                  21         1141          928          101          112-------------------------------------------------------------------------------

Tokei可以按照存储库中README文件上的说明进行安装。

您可以使用名为codel链接)的实用程序。这是一个简单的Python模块,用于统计具有彩色格式的行。

安装

pip install codel

用法

要计算C++文件的行数(扩展名为.cpp.h),请使用:

codel count -e .cpp .h

您还可以忽略一些. gitignore格式的文件/文件夹:

codel count -e .py -i tests/**

它将忽略tests/文件夹中的所有文件。

输出如下所示:

长输出

您还可以使用-s标志缩短输出。它将隐藏每个文件的信息并仅显示有关每个扩展名的信息。示例如下:

短输出

lines=0 ; for file in *.cpp *.h ; do lines=$(( $lines + $( wc -l $file | cut -d ' ' -f 1 ) )) ; done ; echo $lines

在Windows PowerShell上试试这个:

dir -Recurse *.php | Get-Content | Measure-Object -Line

如果你很容易使用窗口2步:

  1. 安装cloc例如打开cmd进行管理并编写下一段代码=>choco install cloc
  2. 然后在带有项目的文件夹中使用cd或打开终端并编写下一个代码=>cloc project-example

sreens与步骤:

  1. 输入图片描述
  2. 输入图片描述

PS需要移动或删除带有构建项目和node_modules的文件夹

您可以使用此Windows Power shell代码来计算您想要的任何文件类型:

 (gci -include *.cs,*.cshtml -recurse | select-string .).Count

bash工具总是很好用,但为此目的,仅仅使用一个这样做的工具似乎更有效。截至2022年,我玩了一些主要的工具,即cloc(perl)gocloc(go)pygount(python)

在没有太多调整的情况下得到了各种结果。似乎最准确和最快的是gocloc

一个带有vue前端的小型laravel项目的示例:

gocloc

$ ~/go/bin/gocloc /home/jmeyo/project/sequasa-------------------------------------------------------------------------------Language                     files          blank        comment           code-------------------------------------------------------------------------------JSON                             5              0              0          16800Vue                             96           1181            137           8993JavaScript                      37            999            454           7604PHP                            228           1493           2622           7290CSS                              2            157             44            877Sass                             5             72            426            466XML                             11              0              2            362Markdown                         2             45              0            111YAML                             1              0              0             13Plain Text                       1              0              0              2-------------------------------------------------------------------------------TOTAL                          388           3947           3685          42518-------------------------------------------------------------------------------

cloc

$ cloc /home/jmeyo/project/sequasa450 text files.433 unique files.40 files ignored.
github.com/AlDanial/cloc v 1.90  T=0.24 s (1709.7 files/s, 211837.9 lines/s)-------------------------------------------------------------------------------Language                     files          blank        comment           code-------------------------------------------------------------------------------JSON                             5              0              0          16800Vuejs Component                 95           1181            370           8760JavaScript                      37            999            371           7687PHP                            180           1313           2600           5321Blade                           48            180            187           1804SVG                             27              0              0           1273CSS                              2            157             44            877XML                             12              0              2            522Sass                             5             72            418            474Markdown                         2             45              0            111YAML                             4             11             37             53-------------------------------------------------------------------------------SUM:                           417           3958           4029          43682-------------------------------------------------------------------------------

pygcount

$ pygount --format=summary /home/jmeyo/project/sequasa┏━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━┓┃ Language      ┃ Files ┃     % ┃  Code ┃     % ┃ Comment ┃    % ┃┡━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━┩│ JSON          │     5 │   1.0 │ 12760 │  76.0 │       0 │  0.0 ││ PHP           │   182 │  37.1 │  4052 │  43.8 │    1288 │ 13.9 ││ JavaScript    │    37 │   7.5 │  3654 │  40.4 │     377 │  4.2 ││ XML+PHP       │    43 │   8.8 │  1696 │  89.6 │      39 │  2.1 ││ CSS+Lasso     │     2 │   0.4 │   702 │  65.2 │      44 │  4.1 ││ SCSS          │     5 │   1.0 │   368 │  38.2 │     419 │ 43.5 ││ HTML+PHP      │     2 │   0.4 │   171 │  85.5 │       0 │  0.0 ││ Markdown      │     2 │   0.4 │    86 │  55.1 │       4 │  2.6 ││ XML           │     1 │   0.2 │    29 │  93.5 │       2 │  6.5 ││ Text only     │     1 │   0.2 │     2 │ 100.0 │       0 │  0.0 ││ __unknown__   │   132 │  26.9 │     0 │   0.0 │       0 │  0.0 ││ __empty__     │     6 │   1.2 │     0 │   0.0 │       0 │  0.0 ││ __duplicate__ │     6 │   1.2 │     0 │   0.0 │       0 │  0.0 ││ __binary__    │    67 │  13.6 │     0 │   0.0 │       0 │  0.0 │├───────────────┼───────┼───────┼───────┼───────┼─────────┼──────┤│ Sum           │   491 │ 100.0 │ 23520 │  59.7 │    2173 │  5.5 │└───────────────┴───────┴───────┴───────┴───────┴─────────┴──────┘

结果喜忧参半,最接近现实的似乎是gocloc,也是迄今为止最快的:

  • 容积:0m0.430
  • 视频:0m0.059s
  • pygcount:0m39.980