xargs的使用

前段时间查自己的代码行数时, 用了”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使用介绍的文章, 很赞.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值