xargs(和管道不能不说的故事)
xargs = x + args (乘号和参数的合体)
是execute arguments的缩写。作用是从标准输入中读取内容并将其传递给它要协助的命令,并作为那个命令的参数来执行。
xargs和管道间的关系
管道: 将前面的标准输出作为后面的“标准输入”
xargs:将前面的标准输出作为后面的“命令参数”
举例:
管道将echo命令的标准输出转换成标准输入,然后xargs将其作为ls命令的参数,如果没有xargs则无法实现该命令,上述命令等价于:
再举个xargs和管道的例子:
cat命令不能直接从标准输入接受参数,此时需要使用xargs将标准输入转换成命令参数传递给cat命令。
再看一个我们在排查类工作经常使用到的find+xargs+grep来完成查询的例子:
在指定的目录下找到包含suse字样的后缀名为.txt的全部文件。
xargs另一个常用用法:将参数分段传递给命令,防止命令参数过长导致命令执行失败
1)创建50万个临时文件
2)尝试用rm一次性删除掉这类log文件
命令报错,提示rm命令后面的参数过长,这里可以用到xargs的协助:
find命令查找到的结果通过管道的作用下传递给了管道后面xargs,xargs将参数分段传递给了rm命令,如是rm命令能够分段来处理文件名。
xargs进阶:
1) -0选项
xargs默认的分隔符是空格,可以使用-0选项将NULL作为分隔符,此时需要配套find命令的 -print0选项。
举例:
由于创建的文件名包含空格,导致使用xargs rm时由于xargs默认的分隔符是空格,因此rm命令执行的并不是
test0 .log一个整体,而是test0和.log两部分,由于实际不存在这两部分文件,因此rm会报错找不到文件。
解决方法,使用xargs的-0选项结合find命令的-print0选项:
2) -E选项
遇到特定的命令参数时就立即终止并推出;
3)-p选项
确认式执行命令;输入y或者n来选择是否要执行当前命令
例如删除当前目录下的普通文件,使用-p参数,那么在rm执行时就会得到确认的反馈,这里我们输入了n,意思是不执行。
总结:xargs通常配套管道一起使用,擅长将标准输入作为其制定命令的参数;并且是分段式的传递命令参数;且可以通过-0、-E、-p等选项达到不同的效果。
题外:为什么find和xargs经常一起出现?☹
find和xargs同属于Unix系统中的大名鼎鼎的findutils软件包,包含了如下4个命令:
(1)find
(2)xargs
(3)locate
(4)updatedb
作者|何佳若
- 点赞
- 收藏
- 关注作者
评论(0)