find . -type f -name '*.c' -exec cat {} \; | sed '/^\s*#/d;/^\s*$/d;/^\s*\/\//d' | wc -l
谁能解释一下其中的含义吗?
答案1
解释:
find . -type f -name '*.c'
- 以递归方式查找当前目录中名称和.c
扩展名中含有任意符号的所有文件。请参阅man find
-exec cat {} \;
- 获取上一步中找到的文件的内容。请参阅 -exec 构造:-exec command {} +
sed '/^\s*#/d;/^\s*$/d;/^\s*///d'
- 删除几种类型的“评论”(或类似的内容)。本部分包含 3 个部分,其中;
.在哪里:
/^\s*#/d
- 行首 (^
)、0、1 或多个空格 (\s*
) 和#
符号。//d
- 删除匹配的字符串;/^\s*$/d
- 空行。与上一部分相同,但带有$
表示行尾的符号/^\s*\/\//d
- 匹配带有两个斜杠(\/\/
,\
- 反斜杠以引用斜杠)且前面有 0,1 个或多个空格的行
wc -l
- 计算代码行数
答案2
find . -type f -name '*.c'
查找任何以 .c 结尾的文件
-exec cat {} \;
运行cat
命令来打印文件(这实际上是无意义的:文件名可以作为参数直接传递给sed
而不是通过管道传递)
| sed '/^\s*#/d;/^\s*$/d;/^\s*\/\//d'
从文件中删除任何预处理器指令、空行和注释(您可以通过| wc -l
从命令中删除该部分来查看不带注释的文件)
| wc -l
统计过滤掉评论后显示的总行数。
答案3
解释一下意思?好的。我认为这意味着有人喜欢在命令之间通过管道传输标准输出。
我认为整个事情可以用一个简单的替代
find . -type f -name '*.c' -exec grep -cv -e '^\s*#' -e '^\s*$' -e '^\s*//' {} \;