Git 获取存储库中所有不同文件类型的行数
如何获取存储库中所有不同文件类型的行数?例如,如果我的存储库包含3种文件类型:Git 获取存储库中所有不同文件类型的行数,git,bash,Git,Bash,如何获取存储库中所有不同文件类型的行数?例如,如果我的存储库包含3种文件类型: 爪哇 xml (无文件扩展名) 我希望输出如下: java 150 xml 20 (no file extension) 30 我可以运行一个命令来检索特定文件类型的行数(git ls files | grep“\.java$”| xargs cat | wc-l),但假设我不知道存储库中的所有文件类型,我将如何使用它们各自的行数来检索它们?这确实是一个Bash问题:如何计算按文件扩展名分组的文件列表中的行数
- 爪哇
- xml
- (无文件扩展名)
java 150
xml 20
(no file extension) 30
我可以运行一个命令来检索特定文件类型的行数(
git ls files | grep“\.java$”| xargs cat | wc-l
),但假设我不知道存储库中的所有文件类型,我将如何使用它们各自的行数来检索它们?这确实是一个Bash问题:如何计算按文件扩展名分组的文件列表中的行数
下面是一种使用awk
的惰性方法:
git ls-files | xargs -n100 wc -l | awk -F ' +|\\.' \
'/\./ { sumlines[$NF] += $2 }
END { for (ext in sumlines) print ext, sumlines[ext] }'
要点:
提供存储库中的文件列表git ls files
从标准输入中获取文件列表,并在其上运行xargs
wc-l
标志是在一次调用中最多传递到-n100
100个文件wc-l
的调用次数等于存储库中的文件数除以100的次数wc-l
完成了对每个文件扩展名的行数进行求和和聚合的繁重工作awk
指定字段分隔符:空格或点。其思想是,-F'+\124;\\.
的输出包含以空格开头的行,后跟行数,后跟空格,后跟文件名。通过使用此字段作为分隔符,第二个字段将是行数,最后一个字段将是文件扩展名。这将有助于计数和聚合wc-l
- 在
中,/\./{sumlines[$NF]+=$2}
是最后一个字段的值,在本例中是文件扩展名,$NF
是行数,如前所述。也就是说,我们对每个扩展的行数求和。$2
过滤器排除输入中没有/\./
的行。这样做的主要原因是从
的输出中排除包含总计的行wc-l
块打印文件扩展名及其总数END
使用janos的解决方案给了我以下错误(我正在一个相当大的项目中使用它): xargs:wc:参数列表太长 因此,我提出了以下解决方案(可能不是最优雅的,但即使在大型项目上也能做到这一点): 这主要包括以下步骤(可根据您的需要进行修改)
- 列出git通过
git ls文件知道的所有文件
- 使用
获取文件的所有文件类型awk
它们排序
- 使它们唯一,并获得发生次数计数
将其反转(出现次数最多的文件类型位于顶部)排序
- 使用
(awk
=计数,$1
=文件类型)打印它们$2
- 使用
head
git
;它应该被标记为bash
。不,是工作分支的当前状态。它可以工作,但也会计算空行和注释。对吗?你有没有办法建议忽略这些?我正在尝试CLOC,但它不支持存储库中的许多文件扩展名。我更新了我的答案,以避免“参数列表过长”的问题,并修复其他不准确之处。在任何情况下,我们的答案都是不同的。我的生成按扩展名分组的文件内容计数,你的生成按扩展名分组的文件计数。我不清楚OP到底想要哪一个,可能是哪一个。是的,你是对的。事实上,当重新考虑这个问题时,我认为OP实际上想要的是行,而不是文件计数:-)
git ls-files | awk -F . '{print $NF}' | sort | uniq -c | sort -n -r | awk '{print $2,$1}' | head -10