前段时间查自己的代码行数时, 用了”find . -name “*.cs” | xargs wc -l“, 但是对xargs在这里的作用有点不了解, 因为网上资料主要都在说 xargs的如下作用:
1. 给其他命令传递参数的一个过滤器
2. xargs可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
3. 防止溢出, 一次从标准输入只读取一部分值, 但是我这里不存在溢出的问题.
根据man手册, xargs的作用是 “xargs从stdin读入每一条, 并且以空白字元或断行字元作为分辨, 将stdin的条目分隔成为 arguments. 因为是以空白字元作为分隔, 所以如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能会误判, 如果需要处理特殊字符, 需要使用-0参数进行处理.”
直接举例子:
当前目录中只有一个SmallInsert.cs文件,其内容以”using System;using System.Collections.Generic;using System.Linq;using System.Text;”开始, 我们接下来执行如下指令:
测试
find . -name "*.cs" | less
显示结果为:
./SmallInsert.cs
接下来我们加上 xargs试下:
find . -name "*.cs" | xargs less
显示结果为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
........
可以看到不加xargs时, 只会将find的结果打印出来. 加上xargs, 会将find找到的cs文件的内容显示出来.
这里就可以看出xargs 和 管道直接传的一个重要区别:
管道是实现”将前面的标准输出作为后面的标准输入”.
xargs是实现”将标准输入作为命令的参数”.
所以 find . -name "*.cs" | xargs less
最终变为 less ./SmallInsert.cs, 这样就会把SmallInsert.cs的内容显示出来. 而find . -name "*.cs" | less
只是利用管道, 把结果直接显示出来.
结论
find, xargs和wc联合使用, 查找代码行数的思路如下:
find: 负责找到所有符合要求的cs文件路径.
xargs: 将cs文件路径以命令参数的形式传给wc.
wc: wc -l 加上find传进来的参数. 形如”wc -l ./SmallInsert.cs”, 这样就可以查找这个cs文件一共有多少行代码.
这里有个对xargs使用介绍的文章, 很赞.