一条命令计算某文件夹下的文件数和代码行数

进行软著申请的时候,相关负责人经常会来找开发提供文件数量和代码量信息,很多开发,尤其前端,不太清楚该如何快速计算这两个结果,我们这里来普及一下吧。

计算文件数和代码量,这种事情,其实接触过shell的人,就了解,并不是多么复杂的事情,只需要一条命令、几秒钟的计算时间,就搞定了。那么具体该怎么操作呢?

计算文件数

计算文件数通常使用的是ls命令。

命令格式

1
ls [选项] [目录名/文件名]

命令参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
-d ## 显示当前目录的上层目录,不显示子目录
-a ## 显示当前目录下的所有子目录,包括隐藏的文件
-l ## 显示当前目录下所有文件的所有信息(除隐藏文件夹外)文件名 子目录的权限 使用者 文件大小 等
-s ## 在每个文件后面显示文件的大小(我觉得-s 表示的是size的意思)
-k ## 树上说以k字节的形式表示文件的大小(我未曾直观的看到怎样以k 字节表示)
-u ## 以文件上次访问的时间排序(我试出来的结果是倒序)
-t ## 以时间排序(应该是以最近访问排序)
-o ## 显示除组信息外的气其他详细信息
-x ## 按列输出横向排序
-r ## 对目录反向排序
-q ## 用“?”表示不可输出的字符(简单尝试为看出效果)
-m ## 横向输入文件名,并且用“,”作为分隔符
-S ## 以文件大小排序(注意大写)
-R ## 列出所有子目录下的文件
-pF ## 在文件后面附上一个字符说明文件的类型。“×”表示可执行文件,“/”表示目录,“@”表示符号链接,“|”表示FIFo(FIFO表示管道,),“=”表示套接字
-C ## 按列输出,纵向排序
-Q ## 把输出的文件名用双引号括起来

用ls命令计算当前文件夹下的文件数

计算文件数,这个描述看起来不复杂,但是细化一下,也会有很多不同的需求,我们举三个常见的细化需求:

不包含目录

1
ls -l | grep "^-" | wc -l

包含子目录

1
ls -lR| grep "^-" | wc -l

当前目录下文件夹的个数

1
ls -lR | grep "^d" | wc -l

计算代码量

计算代码量,我们通常以代码行数为单位。计算代码量的方法有很多,我们这里用find来实现。

命令格式

1
find [路径] [选项] [操作]

命令参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-name ## 根据文件名查找
-perm ## 根据文件权限查找
-prune ## 该选项可以排除某些查找目录
-user ## 根据文件属主查找
-group ## 根据文件属组查找
-mtime-n|+n ## 根据文件更改时间查找

-nogroup ## 查找无有效属组的文件
-nouser ## 查找无有效属主的文件
-newer file1!file2 ## 查找更改时间比file1新但比file2|日IDE文件
-type ## 按文件类型查找
-size-n +n ## 按文件大小查找
-mindepth n ## 从n级子目录开始搜索
-maxdepth n ## 最多搜索到n级子目录

用find命令计算当前文件夹下的代码行数

简单介绍了find命令的使用,回归正题,如何用find命令计算指定文件夹下所有文件的代码行数呢?

基础版

1
2
find . -name "*[.php|.css|.js]"|xargs wc -l|grep "total"|awk '{print $1}'
find . -name "*[.php|.css|.js]"|xargs cat|wc -l

去空行版

1
find . -name "*[.php|.css|.js]"|xargs cat|grep -v ^$|wc -l

上面的^$是正则表达式,^是以匹配开头,$是匹配结尾,所以^$是匹配一个空行。

去注释版

1
find . -name "*[.php|.css|.js]"|xargs cat|grep -v -e ^$ -e ^\s*\/\/.*$|wc -l

上面的^\s*\/\/.*$是正则表达式,其中^\s*表明以空格(多个)开头,\/\/表明是//开头的注释,.*$表明可能以.结尾

去注释版只是去掉以//开头的注释,对于以/* */包含的注释并没有去掉。

本文永久链接: https://www.mulianju.com/count-files/