Linux xarges
对于管道|之后的一部分命令可以用stdin进行输入,如:
cat a | grep test
但有些命令只能用参数形式,就要使用xargs了,xargs可以将stdin转化为参数,类似于find命令中的-exec选项。
xargs也可以将单行或多行文本进行重新格式化。
下面示例是将多行输入处理为单行输出:
[student@myhost ~]$ cat a
space:
tab:
[student@myhost ~]$ cat a | xargs
space: tab:
通过以上命令我们知道了通道符后直接跟xargs可以将多行变为单行。
通过xargs的-n选项可以让单行变为多行,-n后跟的数字为每行的参数数量,以IFS(默认空格)为分隔符:
[student@myhost ~]$ cat a
1 2 3 4 5 6 7 8
[student@myhost ~]$ cat a | xargs -n 3
1 2 3
4 5 6
7 8
我们也可以自定义分隔符,使用-d选项确定分隔符:
[student@myhost ~]$ echo "1a2a3a4a5" | xargs -d a -n 2
1 2
3 4
5
我们可以用xargs给命令输入参数:
[student@myhost ~]$ cat a #a为要执行的文件
echo $*#
[student@myhost ~]$ bash a 1
1#
[student@myhost ~]$ bash a 1 2 3
1 2 3#
[student@myhost ~]$ cat args #xargs文件内容为要输入的参数
1 2 3
[student@myhost ~]$ cat args | xargs -n 1 bash a
1#
2#
3#
[student@myhost ~]$ cat args | xargs -n 2 bash a
1 2#
3#
[student@myhost ~]$ cat args | xargs -n 3 bash a
1 2 3#
当我们需要以下形式的命令参数时:
bash a -p arg1 -o
以上命令只有arg1可变,我们可以用xargs命令的-I(大写i)选项:
[student@myhost ~]$ cat args | xargs -I {} bash a -p {} -o
-p 1 2 3 -o#
我们发现命令只替换到了{}中。
在日常工作中有些常见的与find命令一起的错误用法如:
find . -type f -name "*.txt" | xargs rm -f
以上命令删除使用find查找出来的文件,但如果文件名中有空格就有可能误删文件。我们可以这样改进它:
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
以上命令中find的-print0选项含义为使用\0作为两个文件的分隔符,xargs的-0选项是将\0作为xargs命令读取的分隔符,这样就不会误删了。
统计c程序文件的LOC:
[student@myhost ~]$ find . -name "*.c" -type f -print0 | xargs -0 wc -l
1 ./b.c
1 ./a.c
2 总用量
我们知道xargs不能给提供一个以上的命令提供参数,但通过while和子Shell就可以完成:
cat b.c | (while read args; do echo $args;done )
相当于
cat b.c | xargs -I {} echo {}
以上命令中,while循环里可以执行多个命令,从而可以给多个命令提供同一参数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)