当前位置:  开发笔记 > 编程语言 > 正文

如何计算代码行,包括子目录

如何解决《如何计算代码行,包括子目录》经验,为你挑选了6个好方法。

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

cat * | wc -l

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



1> philant..:

首先,您不需要使用cat计数行.这是一个名为Useless Use of Cat(UUoC)的反模式.要计算当前目录中文件的行数,请使用wc:

wc -l * 

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

find . -name "*.c" -exec wc -l {} \;

. 是要开始搜索的顶级目录的名称

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

-exec 给出一个要执行的命令

{}是将命令传递给命令的结果(这里wc-l)

\; 表示命令的结束

此命令生成与他们的行数找到的所有文件的列表,如果你想拥有的总和为所有的文件中找到,您可以用找到列出文件(使用-print选件),比使用xargs的通过这个列表作为参数到wc-l.

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

编辑以解决Robert Gamble评论(谢谢):如果文件名中有空格或换行符(!),则必须使用-print0选项而不是-print和,xargs -null以便使用以空字符结尾的字符串交换文件名列表.

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

Unix哲学是让工具只做一件事,做得好.


OP的使用不仅没有用,而且管道就像`cat*| wc -l`正好****'cat'(简称con*cat*-enate)的目的是做什么的."无用的cat"是指`cat`用于读取*single*文件并将其传递给程序,而不是使用输入重定向.如果你不相信`cat`在这里没用,那就试试`wc -l*`和`cat*| wc -l`,并观察它们的输出是不同的.
借调.想要指出UUoC(无用的猫),但没有.
"find ... -print0 | xargs -0 ......"技巧值得投入记忆.
我对所有有关反模式的说法感到惊讶,因为没有人提到使用一排代码行作为伪伪度量的反模式。

2> Kent Fredric..:

如果你想要一个代码打高尔夫球的答案:

grep '' -R . | wc -l 

仅仅使用wc -l的问题是它不能很好地下降,而oneliner使用

find . -exec wc -l {} \;

不会给你一个总行数,因为它为每个文件运行一次wc(loL!)和

find . -exec wc -l {} + 

会感到困惑,一旦发现打〜200K 1,2 为参数字符参数限制,而是要求卫生间多个次,每次只给你一个部分摘要.

另外,上面的grep技巧在遇到二进制文件时不会向输出添加超过1行,这可能是有利的.

对于1个额外命令字符的开销,您可以完全忽略二进制文件:

 grep '' -IR . | wc -l

如果要在二进制文件上运行行计数

 grep '' -aR . | wc -l 
关于限制的脚注:

对于字符串大小限制或令牌数量限制,文档有点模糊.

cd /usr/include;
find -type f -exec perl -e 'printf qq[%s => %s\n], scalar @ARGV, length join q[ ], @ARGV' {} + 
# 4066 => 130974
# 3399 => 130955
# 3155 => 130978
# 2762 => 130991
# 3923 => 130959
# 3642 => 130989
# 4145 => 130993
# 4382 => 130989
# 4406 => 130973
# 4190 => 131000
# 4603 => 130988
# 3060 => 95435

这意味着它非常容易进入大块.



3> Ken..:

我想你可能会被xargs困住

find -name '*php' | xargs cat | wc -l

chromakode的方法给出了相同的结果,但速度要慢得多.如果你使用xargs,你的cat and wc ing可以在find开始查找时立即启动.

Linux的好解释:xargs vs. exec {}



4> 小智..:

尝试使用find命令,默认情况下recurses目录:

find . -type f -execdir cat {} \; | wc -l



5> Aaron Digull..:

正确的方法是:

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

您必须使用-print0,因为Unix文件名中只有两个无效字符:空字节和"/"(斜杠).因此,例如"xxx \npasswd"是有效名称.实际上,你更有可能遇到带有空格的名字.上面的命令会将每个单词计为一个单独的文件.

您可能还希望使用"-type f"而不是-name来限制对文件的搜索.



6> Idelic..:

如果你可以使用相对较新的GNU工具,包括Bash,在上述解决方案中使用cat或grep是浪费的:

wc -l --files0-from=<(find . -name \*.c -print0)

这会处理带有空格,任意递归和任意数量匹配文件的文件名,即使它们超出了命令行长度限制.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有