Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 获取存储库中所有不同文件类型的行数_Git_Bash - Fatal编程技术网

Git 获取存储库中所有不同文件类型的行数

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问题:如何计算按文件扩展名分组的文件列表中的行数

如何获取存储库中所有不同文件类型的行数?例如,如果我的存储库包含3种文件类型:

  • 爪哇
  • 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
      标志是在一次调用中最多传递到
      wc-l
      100个文件
      wc-l
      的调用次数等于存储库中的文件数除以100的次数
  • awk
    完成了对每个文件扩展名的行数进行求和和聚合的繁重工作
    • -F'+\124;\\.
      指定字段分隔符:空格或点。其思想是,
      wc-l
      的输出包含以空格开头的行,后跟行数,后跟空格,后跟文件名。通过使用此字段作为分隔符,第二个字段将是行数,最后一个字段将是文件扩展名。这将有助于计数和聚合
    • /\./{sumlines[$NF]+=$2}
      中,
      $NF
      是最后一个字段的值,在本例中是文件扩展名,
      $2
      是行数,如前所述。也就是说,我们对每个扩展的行数求和。
      /\./
      过滤器排除输入中没有
      的行。这样做的主要原因是从
      wc-l
      的输出中排除包含总计的行
    • END
      块打印文件扩展名及其总数
它是懒惰的,因为它不会处理包含换行符的文件,也不会计算没有扩展名的文件中的行数。

注意:重新考虑这个问题后,我真的认为janos'是对所问问题的正确答案。因为它确实提供了行计数,而不是文件计数,就像我的解决方案一样


使用janos的解决方案给了我以下错误(我正在一个相当大的项目中使用它):

xargs:wc:参数列表太长

因此,我提出了以下解决方案(可能不是最优雅的,但即使在大型项目上也能做到这一点):

这主要包括以下步骤(可根据您的需要进行修改)

  • 列出git通过
    git ls文件知道的所有文件
  • 使用
    awk
    获取文件的所有文件类型
  • 排序
    它们
  • 使它们唯一,并获得发生次数计数
  • 排序
    将其反转(出现次数最多的文件类型位于顶部)
  • 使用
    awk
    $1
    =计数,
    $2
    =文件类型)打印它们
  • 使用
    head

是否也要获取历史提交的行计数?否则,这真的不应该被标记为git
git
;它应该被标记为
bash
。不,是工作分支的当前状态。它可以工作,但也会计算空行和注释。对吗?你有没有办法建议忽略这些?我正在尝试CLOC,但它不支持存储库中的许多文件扩展名。我更新了我的答案,以避免“参数列表过长”的问题,并修复其他不准确之处。在任何情况下,我们的答案都是不同的。我的生成按扩展名分组的文件内容计数,你的生成按扩展名分组的文件计数。我不清楚OP到底想要哪一个,可能是哪一个。是的,你是对的。事实上,当重新考虑这个问题时,我认为OP实际上想要的是行,而不是文件计数:-)
git ls-files | awk -F . '{print $NF}' | sort | uniq -c | sort -n -r | awk '{print $2,$1}' | head -10