假设我要计算项目中的代码行数。如果所有文件都在同一目录中,则可以执行:
cat * | wc -l
但是,如果有子目录,则无法使用。为此,cat必须具有递归模式。我怀疑这可能是xargs的工作,但我想知道是否还有更优雅的解决方案?
首先,您不需要使用cat行数。这是一种称为猫的无用使用(UUoC)的反模式。要计算当前目录中文件的行数,请使用wc:
cat
wc
wc -l *
然后,该find命令递归子目录:
find
find . -name "*.c" -exec wc -l {} \;
. 是要从中开始搜索的顶层目录的名称
.
-name "*.c" 是您感兴趣的文件的模式
-name "*.c"
-exec 给出要执行的命令
-exec
{}是find命令传递到命令的结果(在此处wc-l)
{}
wc-l
\; 指示命令结束
\;
此命令生成所有找到的文件及其行数的列表,如果要获得 所有 找到的文件的总和,可以使用find列出文件(带有-print选项),然后使用xargs将此列表作为参数传递去WC-L。
-print
find . -name "*.c" -print | xargs wc -l
编辑以解决Robert Gamble的评论(谢谢):如果文件名中包含空格或换行符(!),则必须使用-print0option代替-printand,xargs -null以便文件名列表与以空终止的字符串交换。
-print0
xargs -null
find . -name "*.c" -print0 | xargs -0 wc -l
Unix的哲学是拥有只做一件事并且做得很好的工具。