一尘不染

如何计算包括子目录在内的代码行数

linux

假设我要计算项目中的代码行数。如果所有文件都在同一目录中,则可以执行:

cat * | wc -l

但是,如果有子目录,则无法使用。为此,cat必须具有递归模式。我怀疑这可能是xargs的工作,但我想知道是否还有更优雅的解决方案?


阅读 249

收藏
2020-06-03

共1个答案

一尘不染

首先,您不需要使用cat行数。这是一种称为猫的无用使用(UUoC)的反模式。要计算当前目录中文件的行数,请使用wc

wc -l *

然后,该find命令递归子目录:

find . -name "*.c" -exec wc -l {} \;
  • . 是要从中开始搜索的顶层目录的名称

  • -name "*.c" 是您感兴趣的文件的模式

  • -exec 给出要执行的命令

  • {}是find命令传递到命令的结果(在此处wc-l

  • \; 指示命令结束

此命令生成所有找到的文件及其行数的列表,如果要获得 所有
找到的文件的总和,可以使用find列出文件(带有-print选项),然后使用xargs将此列表作为参数传递去WC-L。

find . -name "*.c" -print | xargs wc -l

编辑以解决Robert
Gamble的评论(谢谢):如果文件名中包含空格或换行符(!),则必须使用-print0option代替-printand,xargs -null以便文件名列表与以空终止的字符串交换。

find . -name "*.c" -print0 | xargs -0 wc -l

Unix的哲学是拥有只做一件事并且做得很好的工具。

2020-06-03