假设我想计算项目中的代码行数。如果所有文件都在同一个目录中,我可以执行:
cat * | wc -l
但是,如果有子目录,这是行不通的。为此, cat 必须具有递归模式。我怀疑这可能是 xargs 的工作,但我想知道是否有更优雅的解决方案?
最佳答案
首先你不需要使用 cat
来计算行数。这是 antipattern called Useless Use of Cat (UUoC)。要计算当前目录中文件的行数,请使用 wc
:
wc -l *
然后find
命令递归子目录:
find . -name "*.c" -exec wc -l {} \;
.
是开始搜索的顶级目录的名称
-name "*.c"
是你感兴趣的文件的模式
-exec
给出要执行的命令
{}
是find命令的结果要传递给命令(这里是wc-l
)
\;
表示命令结束
这个命令会生成所有找到的文件及其行数的列表,如果你想得到 all 找到的文件的总和,你可以使用 find 列出文件(使用 -print
选项),然后使用 xargs 将此列表作为参数传递给 wc-l。
find . -name "*.c" -print | xargs wc -l
编辑以解决 Robert Gamble 评论(谢谢):如果文件名中有空格或换行符 (!),则必须使用 -print0
选项而不是 -print
和 xargs -null
以便文件名列表与以 null 结尾的字符串交换。
find . -name "*.c" -print0 | xargs -0 wc -l
Unix 的哲学是拥有只做一件事的工具,并且把它做好。
https://stackoverflow.com/questions/316590/