一句shell命令搞定代码行数统计

本文介绍如何使用Shell命令统计特定目录下Java文件的数量及代码行数,并逐步优化统计过程,去除空行和注释行的影响。

语法:wc [选项] 文件…

说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。

该命令各选项含义如下:

  - c 统计字节数。

  - l 统计行数。

  - w 统计字数。

这些选项可以组合使用。

输出列的顺序和数目不受选项的顺序和数目的影响。

总是按下述顺序显示并且每项最多一列。

行数、字数、字节数、文件名

如果命令行中没有文件名,则输出中不出现文件名。

例如:

$ wc - lcw file1 file2
4 33 file1
7 52 file2
11 11 85 total

举例分析:

1.统计demo目录下,js文件数量:

find demo/ -name "*.js" |wc -l

2.统计demo目录下所有js文件代码行数:

find demo/ -name "*.js" |xargs cat|wc -l 或 wc -l `find ./ -name "*.js"`|tail -n1

3.统计demo目录下所有js文件代码行数,过滤了空行:

find /demo -name "*.js" |xargs cat|grep -v ^$|wc -l


今天面试时,突然被面试官问到怎样用shell命令搞定某个文件夹下java代码行数的统计。

想了一下,基本思路就是找到这个文件夹下面的所有java文件,然后每个文件统计一下代码,外层套个for循环,叠加一下结果,就拿到想要的结果了。

不过显然面试官希望我用一句shell搞定,当场晕菜了,没搞定。回来想了一下,其实确实不是啥太难的问题。

 

最粗略版

Shell代码  收藏代码
  1. find . -name "*.java"|xargs wc -l|grep "total"|awk '{print $1}'  
  2. find . -name "*.java"|xargs cat|wc -l    #Output:37634  

上面的两句效果一样,只不过第二种是先利用cat将多个java文件的内容合并输出了。然后再统计。

不过两个都有共同的毛病——连文件里面的空行都给统计进去算作一行了。

去除空行版

Shell代码  收藏代码
  1. find . -name "*.java"|xargs cat|grep -v ^$|wc -l    #Output:36335  
这个版本靠谱一些了,可以看到去掉空行之后的统计结果变为了:36335,比上个版本干掉了1299行的空行。。。 

但是,java代码还有注释呢啊?!Fuck,还得干掉注释!

去除注释版

Shell代码  收藏代码
  1. # exclude the lines begin with //  
  2. find . -name "*.java"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l    #Output:36064  

好,这个方法发现,以//开头的注释有36335-36064=271行。这里需要注意的是,注释行未必就以//作为开头,可能N个空格之后才开始的的//,所以匹配时需要加上上面的^\s*放在开头。

大功告成啦?扯淡!!!

java里面注释好几种风格,再给你看看这个非常常见的注释,还是会在统计结果里面

Java代码  收藏代码
  1. /** 
  2.  * @author xxx 2012-6-15 下午3:19:47 
  3.  */  

咋搞?这种注释我还真没想好怎么方便的除去,简单粗暴的方法但是可以在上面grep的参数里面再加入3个正则,分别去除以/**、*、*/开头的行。不过我自己想着都觉得挫。不知道有没有更好的办法了。

原文链接:

http://www.cnblogs.com/fullhouse/archive/2011/07/17/2108786.html

http://hittyt.iteye.com/blog/1700584

<think>我们之前讨论过使用shell脚本统计目录下所有文件数的方法。用户现在明确询问如何用shell命令实现统计文件数之和,即对之前方法的总结和提炼。 核心需求:一个命令命令组合,能够递归统计指定目录下所有文件的数之和。 根据之前的讨论,最推荐的方法是使用find结合xargs和wc,然后通过awk求和。这个方法高效且安全(支持特殊字符文件名)。 因此,我们可以给出如下命令: find /path/to/dir -type f -print0 | xargs -0 wc -l | grep -v ' total$' | awk '{sum+=$1} END{print sum}' 但用户可能希望有一个更简洁的总结,并且可能需要考虑一些常见问题(如排除目录、特定文件等)。 为了完整,我们还可以提供另一种方法:使用递归的shell函数(虽然效率较低,但可读性好)。 另外,注意用户特别强调是“shell命令”,所以我们应避免使用复杂脚本,尽量用管道组合命令。 考虑到用户可能需要直接复制粘贴使用,我们给出一个可以直接运命令,并解释每个部分。 同时,根据用户要求,我们需要生成相关问题。 注意:我们之前已经详细讨论过,这里需要提炼核心方法,并确保命令的准确性和安全性。 因此,回答结构如下: 1. 推荐方法(find+xargs+wc+awk)及命令 2. 简单说明命令的每一部分 3. 可选:递归方法的命令形式(函数形式) 4. 常见问题处理(如需要排除目录等) 最后,生成相关问题。 注意:用户要求使用中文,且按照格式要求(包括数学公式的LaTeX格式)。虽然当前问题不涉及数学公式,但如果有变量说明,我们会使用$...$格式。 下面开始组织回答。 </think>### Shell命令统计文件数之和的方法 以下是三种高效可靠的Shell命令实现方案,可直接在终端执: #### 方法1:`find + wc + awk`(推荐方案) ```bash find /path/to/dir -type f -exec wc -l {} + | awk '{sum+=$1} END{print sum}' ``` **执示例**: ```bash $ find ~/project -type f -exec wc -l {} + | awk '{sum+=$1} END{print sum}' 287654 ``` **核心原理**: 1. `find -type f`:递归查找所有文件(不含目录)[^1] 2. `-exec wc -l {} +`:批量统计文件数(避免`xargs`依赖) 3. `awk`计算总和:累加每文件数并输出总和 $sum$[^2] #### 方法2:递归Shell函数 ```bash ( shopt -s dotglob nullglob; lines=0; count() { for f in $1/*; do [ -d "$f" ] && count "$f"; [ -f "$f" ] && ((lines+=$(wc -l < "$f"))); done; }; count "/path/to/dir"; echo $lines ) ``` **特点**: - 子Shell环境执(不修改当前Shell配置) - `shopt -s dotglob`包含隐藏文件 - 递归处理嵌套目录 #### 方法3:`grep`快速统计 ```bash find /path/to/dir -type f -exec cat {} + | grep -c '^' ``` **适用场景**: - 当文件数量巨大时效率更高 - 通过`^`首匹配精确统计数[^3] --- ### 扩展功能示例 #### 1. 排除特定目录 ```bash find /path/to/dir -type f -not -path "*/.git/*" -exec wc -l {} + | awk 'END{print s}{s+=$1}' ``` #### 2. 仅统计特定扩展名 ```bash find /path/to/dir -name "*.py" -exec wc -l {} + | awk '{s+=$1} END{print s}' ``` #### 3. 实时显示进度 ```bash find /path/to/dir -type f -print0 | while IFS= read -r -d '' file; do ((total+=$(wc -l < "$file"))); printf "\r当前统计: %d" $total; done; echo ``` > **注意事项**: > 1. 以上方法均统计符数量(`LF`或`CRLF`) > 2. 二进制文件会被计入统计(结果可能包含非文本) > 3. 当文件数量超过系统参数限制时,方法1的`-exec {} +`会自动分批处理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值