关于bash:如何递归地计算目录中的所有代码行?

How to count all the lines of code in a directory recursively?

我们有一个PHP应用程序,想要计算特定目录及其子目录下的所有代码行。我们不需要忽视评论,因为我们只是想得到一个大致的想法。

1
wc -l *.php

该命令在给定的目录中非常有效,但忽略了子目录。我原以为这可能行得通,但现在是74,这绝对不是事实…

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

输入所有文件的正确语法是什么?


尝试:

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

SlocCount工具也可能有帮助。

它将为任何您指向的层次结构,以及一些附加的统计信息。

  • cloc.sourceforge.net可能值得作为sloccount(更多语言,但信息更少)的替代方案。
  • 还包括:find . -name '*.php' -o -name '*.inc' | xargs wc -l
  • 当有多个文件时,这将打印多个数字(因为wc将多次运行)。也不处理许多特殊文件名。
  • 是否有方法从计数中排除目录(例如/tests)?
  • 这应排除空白行$ find . -name '*.php' | xargs cat | awk '/[a-zA-Z0-9]/ {i++} END{print i}'
  • @我是:find . -name"*.php" -not -path"./tests*" | xargs wc -l
  • 注意。wc计算行结束代码,而不是行。我稍后在这篇文章中描述了这一点。使用grep^,而不是wc-l。如果需要的话,grep可以过滤掉只有白色字符的计数行。
  • 如果目录名包含任何空格…以上命令失败!!
  • 这应该是一个解决办法:find . -name '*.php' | awk '{gsub("","\\", $0);print $0}' |xargs wc -l
  • 顺便说一句,xargs在Windows shell中本机不可用,但是如果您碰巧安装了git,那么这个解决方案在git bash中工作得很好。
  • @nitish712 find和xargs分别使用-print0-0选项处理空间问题。所以你可以试试像find . -name"*.php" -print0 | xargs -0 wc -l这样的东西。
  • @l0b0这是否意味着最后一个总数将不准确或只是显示多次?
  • @tietyt它将是不准确的,因为它将把文件放在一起并计算每个块中的行数,而不进行汇总。
  • @l0b0啊,那么(无意冒犯)这似乎是比Shizzmo的解决方案差的多
  • @从技术上讲,是的,但它与posix兼容(-print0不兼容),更短,除非有很多文件,否则它可以工作。
  • iOS应用:find . -name '*.[h|m|plist]' | xargs wc -l
  • Ubuntu上的sudo apt-get install sloccount。然后是$ sloccount mydir
  • 如何从计数中排除空行?
  • @如何排除多个文件夹?
  • @l0b0对于大量文件,它应该与cat在:find . -name '*.php' | xargs cat | wc -l之间工作。
  • 很抱歉,我想知道为什么使用xargs会有效,如果不使用xargs,它将不起作用
  • @idober-修剪,如find . -name tests -prune -o -type f -name '*.php' | xargs wc -l
  • 我如何编写一个函数来在bash中快捷地执行这个命令?在我的.bash_配置文件中,我目前有:函数lncnt_find。-名称$1 xargs wc-l;但当我运行该命令时,它只按字母顺序计算第一个文件的行数。
  • 管道输出和使用xargs有什么区别?
  • 根据@vcardillo的评论,如果您使用的是OSX并安装了自制,则可以运行:brew install sloccount,然后运行sloccount mydir
  • 顺便说一句,CLOC好像已经搬到了Github
  • 我知道这个问题是关于PHP的,但我敢打赌其他语言的人也会来。为了简化复制粘贴体验,这里有几行。js:find . -name '*.js' | xargs wc -lcss:find . -name '*.css' | xargs wc -ljsx:find . -name '*.jsx' | xargs wc -l
  • 这对我来说不准确,把结果和迈克尔·怀尔德比较一下。对我来说,迈克尔·怀尔德的命令给出了准确的结果。
  • 我很惊讶这里没有简单的解决方案来解决"路径中有一个空间"问题。这就是我最后得出的结论:find . -name '*.swift' -exec wc -l {} \+。最后的+表示wc只运行一次,速度很快!
  • sloccount也可以计算.r文件吗?


对于另一个内衬:

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

使用带空格的名称,只输出一个数字。

  • +1用于-print0/-0
  • +1同上……永远搜索……所有其他"find"命令只返回实际文件的……这里的-print0文件为我获得了实际行数!!!!谢谢!
  • 我找到了最好的解决方案。我参数化了路径和文件类型,并将此代码添加到了路径上的脚本中。我计划经常使用它。
  • 你为什么要感谢print0?那是什么意思?
  • @托本肯德托夫布鲁恩-见man find。带有xargs-0的print0允许您对名称中包含空格或其他奇怪字符的文件进行操作
  • @同时,xargs中的-0对应于print0,这是一种处理空格的编码/解码。
  • 有没有办法用这个排除特定的子目录?
  • 如果您需要多个名称过滤器,我发现(至少使用find的msysgit版本),您需要额外的parens:( find . \( -name '*.h' -o -name '*.cpp' \) -print0 | xargs -0 cat ) | wc -l
  • 在我看来,这应该是一个公认的答案,因为它给出了一个单一的数字(这个问题隐含的东西)。
  • 我喜欢这个命令在日志文件系统上的速度(即时)
  • @Ronedog:它工作的原因是因为xargs正在执行"cat"命令。-print0只意味着它使用空字符来分隔传递给xargs的文件名,以便正确处理空格。
  • @Adrian设计:日志记录有助于故障恢复,而不是速度。由于高速缓存或非常快的HDD,您可能看到了良好的性能。
  • @你的解决方案不排除空行。
  • 如果存在递归目录,就会出现错误,因为它也会尝试将目录分类出来…或者更糟的是,在某些Linux系统目录中,cat of directory将返回其中的文件,因此在总行数中,将添加文件数。
  • 与公认的答案不同,这个方法适用于包含空格的目录名。
  • 同样,我放弃cat来打印文件名,这在OS X:find . -name '*.php' -print0 | xargs -0 wc -l上实现了相同的总输出。
  • 这种方法不适用于实际的项目。你的记忆力会耗尽
  • ( find ./ -name '*.java' -print0 | xargs -0 cat | sed '/^\s*$/d' ) | wc -l:添加EDCOX1×18 }将忽略文件中的所有空行。
  • @wisienkas不是真的,它几乎没有记忆。每个文件都被传输到wc -l。并不是所有的文件都集中在一起然后发送到wc。这就是我们在这里使用xargs的原因。记住,这些东西是很久以前制造的,那时人们的记忆要少得多。


如果使用的是bash(或zsh)的最新版本,就简单多了:

1
wc -l **/*.php

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

1
shopt -s globstar

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

  • 为了简单起见,我赞成这样做,但是我只想指出,它似乎不会递归地搜索目录,它只检查当前目录的子目录。这是SL6.3。
  • 这取决于你的外壳和你设置的选项。bash需要设置globstar才能工作。
  • @Michaelwild,如果我需要的代码行数超过了它的处理能力怎么办?它为Linux内核返回了一个非常低的值…
  • @petersenna命令使用当前的3.9.8内核存档,wc -l **/*.[ch]命令总共找到15195373行。不确定你是否认为这是一个"非常低的价值"。同样,您需要确保在bash中启用了globstar。你可以和shopt globstar核对一下。要明确地启用它,请执行shopt -s globstar
  • @希娜,你真的读过这些评论吗?如果启用gobstartshell选项,则它是递归的。
  • @michaelwild这是一个很好的解决方案,但是如果您有大量的.php文件,它仍然会溢出ARG_MAX,因为wc不是内置的。
  • 结果似乎比公认的答案大。有人知道为什么吗?
  • @不,您需要比较两种方法生成的文件列表。正如@broslow所提到的,我的方法存在无法处理大量文件的问题。如果find生成的路径包含空格,则接受的回答将失败。这可以通过分别使用print0--nullfindxargs调用来解决。


您可以使用cloc实用程序,它是为这个确切目的而构建的。它报告每种语言中每行的数量,以及其中有多少行是注释等。CLOC在Linux、Mac和Windows上可用。

用法和输出示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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
-------------------------------------------------------------------------------

  • 这是一个可爱的工具,运行良好,并在最后迅速提供有用的统计数据。喜欢它。
  • 它在Unix上也能很好地工作。只是一个剧本。
  • 请注意,您可以使用cygwin(或其他类似的端口/环境)在Windows上运行UNIX命令。对我来说,拥有这种访问非常有用,这是必要的。Unix命令行很神奇。我特别喜欢Perl和正则表达式。
  • CLOC和SlocCount在2015年年中的MacBook上运行良好。注意他们的数字很接近,但对于127K Java Android项目并不完全相同。同样要注意的是,iOS的等价物有2倍的loc;所以,sloccount中的"成本"度量可能是关闭的(或者iOS dev的值可能是android dev的2倍)。-)
  • 您是否考虑编辑这个问题的开头以明确说明cloc是跨平台的,因为它只是一个Perl脚本?
  • 很好,当然在windows bash中也能很好地工作。


在类Unix系统上,有一个名为cloc的工具,它提供代码统计信息。

我在我们的代码库中的一个随机目录中运行它说:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
      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
-------------------------------------------------------------------------------

  • 这是cloc:cloc.sourceforge.net的站点
  • 这与西芒2011年给出的答案相同。
  • @从技术上讲,MooseSimtao特别提到它是一个针对Windows用户的解决方案,根本没有提到Linux或Unix。
  • @驼鹿桌子被编辑成他的答案比我的答案晚得多,现在这两个看起来确实很相似。
  • 我喜欢它。CLOC真的很整洁。但是这个名字是什么意思?
  • @manoElvilela cloc="计算代码行数"
  • 它也在窗户上!假设你有巧克力:choco install cloc


您没有指定有多少个文件,或者所需的输出是什么。这就是你要找的:

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

  • 只要文件不太多,这样就可以了:如果文件太多,结果会得到几行(xargs会将文件列表拆分为多个子列表)
  • 啊,是的。这就是为什么我说他没有指定有多少个文件。我的版本更容易记住,但如果您有多个文件,Shin的版本更好。我要投票决定。
  • 我需要修改这个函数,因为单引号太过严格: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/* . }的结果接近*.py的最慢计数,但它不知道*.js*.html
  • 不适用于MacOS


还有另一个变种:)

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

编辑:这将给出总数,而不是逐个文件。

edit2:find后加.使之工作

  • 这使用反模式!猫没用!
  • @乔希123A123,有更好的主意如何给出一个合计?
  • 公认的答案就是:找到。-如果您注意到这一行超过了cat的需求,并直接将find的结果添加到wc的参数中,那么就将其命名为"*.php"xargs wc-l。你的答案是把结果从find传给cat,然后传给wc,cat是不必要的步骤。
  • 我的答案做了另一件事——它对所有文件的代码行求和。编辑了回复。
  • 两个答案的总和。
  • 至少在Cygwin,我有更好的结果:$ find -name \*\.php -print0 | xargs -0 cat | wc -l
  • 关于达尔文,这只给出了一个总数:find . -name '*.php' | xargs cat | wc -l…鉴于此,按文件和总计提供文件:find . -name '*.php' | xargs wc -l
  • 不适用于MacOS


POSIX

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

每个文件中的行:

1
2
3
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 {} +

每个文件中的行,按文件路径排序

1
2
3
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

每个文件中的行,按行数排序,降序

1
2
3
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

所有文件中的总行数

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

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

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

  • 这并不完全符合你的想法。找到。-名称".[am]"与find相同。-名称".[a_m]"都将查找以.m或.a结尾的所有文件。
  • 但第二个也会找到以结尾的文件(如果有的话)。所以[h c cpp php c c]最终与[hcp]相同。


令人惊讶的是,基于find的-execawk,没有答案。我们走到这里:

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

此代码段用于查找所有文件(-type f)。要通过文件扩展名查找,请使用-name

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

  • 从功能上讲,这是完全可行的,但是在大型列表(Linux源代码)中,它确实很慢,因为它为每个文件启动一个wc进程,而不是为所有文件启动一个wc进程。我用这个方法把时间定在31秒,而用find . -name '*.c' -print0 |xargs -0 wc -l的方法是1.5秒。也就是说,这个更快的方法(至少在OSX上)会多次打印"总计",因此需要进行一些额外的筛选以获得正确的总计(我在答案中发布了详细信息)。
  • 这样做的好处是可以为无限数量的文件工作。做得好!
  • 一旦使用大量的GB和文件,这是一个更好的解决方案。在cat的形式上执行一个wc是缓慢的,因为系统首先必须处理所有GB才能开始计算行数(用200GB的JSON测试,12K文件)。先做wc,然后计算结果要快得多。
  • @Dougrichardson,你可以考虑这样做:find . -type f -exec wc -l {} \+find . -name '*.py' -type f -exec wc -l {} \+,在输出结束时打印一个总数。如果你只对总数感兴趣,那么你可以进一步使用tailfind . -type f -exec wc -l {} \+ | tail -1find . -name '*.py' -type f -exec wc -l {} \+ | tail -1


有一个叫做sloccount的小工具来计算目录中的代码行数。应该注意的是,它做的比您想要的要多,因为它忽略空行/注释,按编程语言对结果进行分组,并计算一些统计数据。


您需要的是一个简单的for循环:

1
2
3
4
5
6
7
total_count=0
for file in $(find . -name *.php -print)
do
    count=$(wc -l $file)
    let total_count+=count
done
echo"$total_count"

  • 这难道不比那些建议使用xargs的答案更具杀伤力吗?
  • 不,弥敦。xargs答案不一定将计数打印为单个数字。它可能只是打印一堆分类汇总。
  • 如果文件名包含空格,该程序将做什么?换行怎么样?;-)
  • 如果你的文件名包含新行,我会说你有更大的问题。
  • @Ennuikiller有很多问题,首先,它将在带有空白的文件上中断。在循环之前设置IFS=$'
    '
    至少可以修复除名称中有换行符的文件以外的所有文件。其次,您没有引用'*.php',所以它将由shell而不是find进行扩展,并且ergo实际上不会在子目录中找到任何PHP文件。另外,-print是多余的,因为它是在没有其他行动的情况下隐含的。
  • 我会将第4行改为:count=$(wc-l<$file),以抑制语法错误,否则这是一种替代方法,尽管我认为这有点过分了。


仅限来源:

1
wc `find`

要过滤,只需使用grep

1
wc `find | grep .php$`

一个简单易行、速度快、使用find的所有搜索/过滤功能,在文件太多时不会失败(数字参数溢出),在文件名中使用有趣符号的文件时,如果不使用xargs,将不会启动无用的大量外部命令(由于+)。〔3〕的-exec。干得好:

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

  • 我正准备自己发布一个变体(用\;代替+,因为我不知道),这个答案应该是正确的答案。


Guessing no one will ever see this buried at the back... Yet none of the answers so far gets at the problem of filenames with spaces. Additionally, all that use xargs are subject to fail if total length of paths in the tree exceeds the shell environment size limit (defaults to a few megabytes in Linux). Here is one that fixes these problems in a pretty direct manner. The subshell takes care of files with spaces. The awk totals the stream of individual file wc outputs, so ought never to run out of space. It also restricts the exec to files only (skipping directories):

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

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


WC -L ? better use GREP -C ^

WC-L?错了!wc命令计算新行代码,而不是行!如果文件中的最后一行没有以新的行代码结尾,则不会计算在内!

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

1
2
3
4
5
6
7
8
9
#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陷阱(计数进入,而不是线!!!!)

  • 请阅读一行的POSIX定义。使用grep -c ^时,您要计算不完整行的数目,这样不完整的行不能出现在文本文件中。
  • 我知道。实际上,只有最后一行可能不完整,因为它没有EOL。想法是计算所有的行,包括不完整的行。这是非常常见的错误,只计算完整的行。数数之后,我们在想"为什么我错过了最后一行?"??"这就是为什么要这样做的答案,以及如何正确地做。


如果要按行数排序结果,可以将| sort| sort -r(-r)添加到第一个答案中,如下所示:

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

  • 由于xargs wc -l的输出是数字,所以实际需要使用sort -nsort -nr


使用zsh globs非常简单:

1
wc -l ./**/*.php

如果您使用的是bash,那么只需升级即可。完全没有理由使用bash。


不同的东西:

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

这很好,但您需要在当前文件夹或其子文件夹中至少有一个*.php文件,否则wc暂停。

  • 也可能溢出arg_max


如果您只需要输入总行数,比如说您的PHP文件,那么即使在安装了gnuwin32的Windows下,也可以使用非常简单的单行命令。这样地:

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

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

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

  • 在上面的例子中,我使用的是bash for windows而不是cmd.exe,这就是为什么有正斜杠"/"而不是反斜杠""。


首先给出最长的文件(例如,这些长文件可能需要一些重构的爱好?),并排除一些供应商目录:

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

对于Windows,简单快速的工具是loctmetrics。

  • 如果Windows使用bash,那么它不太可能出现在Windows上。
  • @Vanessamchale的问题标题和描述显然不需要纯UNIX解决方案。所以基于Windows的解决方案是可以接受的。当我在寻找类似的解决方案时,谷歌也把我指向了这个页面。


如果你在Linux上(我认为你是),我推荐我的工具polyglot。它比sloccountcloc快得多,而且比sloccount更具特色。

你可以用

1
poly .

1
poly

因此,它比一些复杂的bash脚本更加用户友好。


你不需要所有这些复杂而难以记忆的命令。你只需要一个叫做线路计数器的工具。

快速概述

这就是你得到工具的方法

1
$ pip install line-counter

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

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

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

1
2
3
4
5
6
7
8
$ 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


不包括空行

1
2
find . -name"*.php" | xargs grep -v -c '^$' | awk 'BEGIN {FS=":
<div class="suo-content">[collapse title=""]<ul><li>不起作用。.</li></ul>[/collapse]</div><hr><P>至少在OSX上,在一些其他答案中列出的find+xarg+wc命令在大型列表中多次打印"total",并且没有给出完整的total。我可以使用以下命令获得.c文件的单个总数:</P><P><wyn>find . -name '
*.c' -print0 |xargs -0 wc -l|grep -v total|awk '{ sum += $1; } END { print"SUM:" sum; }'</wyn></P><hr><P>虽然我喜欢这些脚本,但我更喜欢这一个,因为它还显示每个文件的摘要,以及总计</P>[cc lang="bash"]wc -l `find . -name"*.php"`

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

1
 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

产生这种输出:

1
2
3
4
5
6
7
8
9
10
11
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

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

或者用现代语法:

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

只要目录名或文件名中没有空格,就可以工作。只要你没有成千上万的文件(现代的shell支持非常长的命令行)。你的项目有74个文件,所以你有足够的空间增长。

  • 我喜欢这个!如果处于混合C/C++环境:EDCOX1〔0〕
  • 很惊讶这不是最好的答案


1
2
$cd directory
$wc -l* | sort -nr

我的Windows系统上安装了"忙碌"框。这就是我所做的。

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

我想检查多个文件类型,却懒得手工计算总数。所以我现在用这个一次就得到总数。

1
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
Total text lines in PHP and JS 94669

这允许您链接希望筛选的多个扩展类型。只需将它们添加到-name '*.js' -or -name '*.php'部分,并可能根据您的喜好修改otuput消息。


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

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

与其他答案的主要区别:

  • 使用find-exec,
  • 使用浆糊(带切口)
  • 使用BC
    • 我在自己的答案中对此做了一点修改,以便在OSX上工作,但是这个版本是否也应该有一个"-"作为最后一个要粘贴的参数,以便它从stdin中获取输入?或者Paste在Linux上默认是这样做的?
    • 默认情况下,它会这样做。抱歉,我没看到它只适用于OS X。
    • 这个问题是一般性的,所以您的答案对于Linux来说非常好(而且我也非常喜欢它来为我的OS X变体建模!),只是想知道Paste在Linux上是否真的有点不同,或者这是否是一个需要修复的拼写错误。
    • 哦,现在我明白你的问题了!我们正在铺设管道,所以不需要使用-选项。
    • 这是因为管道的缘故,我不得不在OSX上使用"-"来让它从stdin中获取输入(否则它将寻找一个文件参数)。我上次在Linux上使用Paste已经很久了,我不记得某些版本的默认值是stdin…


    非常简单

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

    • 如果其中一个文件名中有空格或换行符,它将失败。


    首先更改要知道行数的目录。例如,如果我想知道名为sample的目录的所有文件中的行数。给$cd sample。然后尝试命令$wc -l *,这将返回每个文件的行数,以及最后整个目录中的行总数。

    • 不会递归计算的对吗?


    我是这样做的:

    下面是linecount.c文件实现:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #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)
    "
    ,    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 == '
    '
    ) ++lines;
        fclose(file);  
        return lines;
    }

    现在打开命令行:

    和类型gcc lineCount.c,然后类型./a.out *.txt。这将显示目录中以.txt结尾的文件的总行数。


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

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

    我还可以添加另一个OS X条目,这个条目使用普通的带exec的old find(我更喜欢使用xargs,因为我以前看到过非常大的find结果集与xargs的奇数结果)。因为这是针对OS X的,所以我还添加了对.h或.m文件的筛选-请确保一直复制到最后!

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

    1
    cat \`find . -name"*.php"\` | wc -l