如何获取存储库中所有不同文件类型的行数?例如,如果我的存储库包含3种文件类型:
我希望输出是这样的:
java 150
xml 20
(no file extension) 30
我可以运行一个命令来检索特定文件类型(git ls-files | grep "\.java$" | xargs cat | wc -l
)的行数,但假设我不知道我的存储库中的所有文件类型是什么,我将如何进行检索他们都有各自的行数?
答案 0 :(得分:13)
这真是一个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
标记将在一次调用中传递给wc -l
最多100个文件。 wc -l
将被调用多次,因为存储库中的文件数除以100。awk
完成了对每个文件扩展名的行数进行求和和聚合的繁重工作
-F ' +|\\.'
指定字段分隔符:空格或点。我们的想法是wc -l
的输出包含以空格开头的行,后跟行数,后跟空格,后跟文件名。通过使用它作为分隔符,第二个字段将是行数,最后一个字段将是文件扩展名。这对于计算和聚合非常有用。/\./ { sumlines[$NF] += $2 }
中,$NF
是最后一个字段的值,在此示例中为文件扩展名,$2
是行数,如前所述。也就是说,我们将每个扩展的行数相加。 /\./
过滤器会排除输入中没有.
的行。这样做的主要原因是从wc -l
的输出中排除总计的行。END
块打印文件扩展名及其总计数这是懒惰的,因为它不适用于包含换行符的文件,并且它不计算没有扩展名的文件中的行。
答案 1 :(得分:4)
注意 :重新考虑之后,我真的认为janos'是问题的正确答案。因为它确实提供了行数而不是文件数,就像我的解决方案一样。
使用janos'解决方案给了我以下错误(我在一个相当大的项目中使用它):
xargs:wc:参数列表太长
所以我想出了以下解决方案(可能不是最优雅的,但即使在大型项目上也能做到这一点):
git ls-files | awk -F . '{print $NF}' | sort | uniq -c | sort -n -r | awk '{print $2,$1}' | head -10
这基本上包括以下步骤(可能会根据您的需要进行修改)
git ls-files
awk
获取文件的所有文件类型sort
他们sort
它们被反转(文件类型,最多出现在顶部)awk
打印它们($1
= count,$2
= filetype)head