如何计算在递归目录中的所有代码行?(How to count all the lines of co

2019-06-21 08:04发布

我们已经有了一个PHP应用程序,并想算一笔特定的目录及其子目录下的所有代码行。 我们不需要忽略评论,我们只是想获得一个粗略的想法。

wc -l *.php 

该命令指定目录中的伟大工程,但忽略子目录。 我想这可能工作,但它返回74,这绝对不是这样...

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

什么是正确的语法中的所有文件养活?

Answer 1:

尝试:

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

该SLOCCount工具可以很好的帮助。

这会给为你点它在任何层次码计数准确的源代码行,以及一些额外的统计数据。



Answer 2:

对于另外一个班轮:

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

适用于有空格的名称,只输出一个号码。



Answer 3:

如果使用的是体面最近击(或ZSH)的版本,它的简单得多:

wc -l **/*.php

在Bash shell中这需要globstar选项进行设置,否则**水珠运营商不是递归。 要启用此设置,问题

shopt -s globstar

为了使这个永久性的,将其添加到初始化文件(之一~/.bashrc~/.bash_profile等等)。



Answer 4:

您可以使用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
-------------------------------------------------------------------------------


Answer 5:

在类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
-------------------------------------------------------------------------------


Answer 6:

您没有指定多少文件存在或什么是所需的输出。 这是你想要的:

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


Answer 7:

另一个变化:)

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

编辑:这会给而不是文件通过文件的总和。

EDIT2:添加.find ,使其工作



Answer 8:

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


Answer 9:

更常见和简单对我来说,假设你需要统计不同扩展名的文件(比如说,也土人)

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


Answer 10:

令人惊讶的是没有根据发现的回答-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; }'


Answer 11:

有一个叫的小工具sloccount计数的代码行目录。 应当指出的是,它比你要因为它忽略空行/意见,团体每编程语言的结果,并计算一些统计数据更多。



Answer 12:

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

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


Answer 13:

对于来源,只:

wc `find`

进行筛选,只使用grep

wc `find | grep .php$`


Answer 14:

一个直接的一个,这将是快速的,将使用所有的搜索/过滤的力量find ,当有太多的文件(编号参数溢出),做工精细用他们的名字有趣的符号文件,而无需使用不会失败xargs ,不会推出无用地高数量的外部命令(感谢+用于find-exec )。 干得好:

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


Answer 15:

猜没有人会看到这个埋在后面......但没有一个答案,到目前为止,在得到与空格的文件名的问题。 此外,所有使用xargs受如果在树的路径总长度超过外壳环境大小限制(默认为在Linux中几兆字节)失败。 这是一个在一个相当直接的方式解决这些问题。 子shell负责文件与空间。 该awk合计单个文件的流wc输出,因此应该永远用完的空间。 这也限制了exec的文件只(跳过目录):

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


Answer 16:

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

塞巴斯蒂安·伯格曼写了一个工具,叫做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

正如你所看到的,所提供的信息是很多从开发者的角度来看更为有用,因为它可以大致告诉你项目有多么复杂,你开始使用它之前。



Answer 17:

WC-L? 更好地使用grep -C ^

WC -l? 错误! wc命令计数新行代码,而不是线! 当文件不符合新行代码结束最后一行, 这将不计!

如果你还想指望行,用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陷阱(计数进入,而不是行!)



Answer 18:

如果你希望你的结果用线数量排序,你可以添加| sort | sort| sort -r | sort -r-r按降序排序)于第一答案,就像这样:

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


Answer 19:

有些不同:

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

这工作了罚款,但你需要至少有一个*.php在当前文件夹中的文件或子文件夹中的一个,要不然wc摊位



Answer 20:

这是很容易与zsh的水珠:

wc -l ./**/*.php

如果你使用bash,你只需要升级。 我们绝对没有理由使用bash。



Answer 21:

如果你只需要在假设你的PHP文件,你可以,如果你已经安装的GnuWin32甚至在Windows下使用非常简单的一行命令行的总数。 像这样:

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

你需要指定究竟否则Windows自带的FIND.EXE FIND.EXE(从旧类似DOS的命令)将被执行,因为它可能是在的GnuWin32环境路径之前,和有不同的参数和结果。

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



Answer 22:

首先给予了最长的文件(即也许这些长文件需要一些重构爱吗?),但不包括一些供应商目录:

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


Answer 23:

对于Windows,方便,快捷的工具是LocMetrics



Answer 24:

在OS X上至少,查找一些其他的答案打印“总”多次在大型上市的上市+ xarg + WC命令,并没有给出任何完成总。 我能得到使用以下命令.c文件单总:

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



Answer 25:

我用这个内嵌脚本,我从SRC-项目的目录推出:

 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.


Answer 26:

而我喜欢的剧本,我更喜欢这一个,因为它也显示每个文件的概要,只要总

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


Answer 27:

不包括空行

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

包括空行:

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


Answer 28:

如果你想保持它的简单,省去了中间人,只是叫wc与所有的文件名:

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

或在现代化的语法:

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

只要有任何的目录名或文件名没有空格的作品。 而且只要你没有文件数万(现代炮弹支持很长的命令行)。 你的项目有74个文件,所以你有足够的成长空间。



Answer 29:

你并不需要所有这些复杂难记的命令。 你只需要一个叫做行计数器工具。

快速概览

这是你如何得到该工具

$ 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



Answer 30:

如果你在Linux(和我想你是),我建议我的工具, 通晓多国语言 。 此产品比大大加快sloccountcloc它比更多的其他功能sloccount

你可以调用它

poly .

要么

poly

所以它更加人性化比一些令人费解的bash脚本。



文章来源: How to count all the lines of code in a directory recursively?
标签: bash shell