您的位置:首页 > 运维架构 > Shell

xargs的使用

2016-04-11 10:10 549 查看
前段时间查自己的代码行数时, 用了”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使用介绍的文章, 很赞.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Shell xargs find wc