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

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

wc -l *.php 

该命令对于给定的目录非常有效,但它忽略了子目录。我想下面的评论可能有用,但它返回了74,这绝对不是这样。。。

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

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


当前回答

这里有一个使用旧Python(至少适用于Python2.6)的灵活应用程序,结合了Shizzmo可爱的一行程序。只需在类型列表中填写源文件夹中要计算的文件类型,然后让它飞起来:

#!/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)

其他回答

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 of '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陷阱(计数进入,而不是行!!!)

仅适用于来源:

wc `find`

要过滤,只需使用grep:

wc `find | grep .php$`

您可以使用名为codel(link)的实用程序。这是一个简单的Python模块,可以用彩色格式计算行数。

安装

pip install codel

用法

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

codel count -e .cpp .h

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

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

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

输出如下所示:

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

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

这可能是您想要的:

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}'