Linux xargs命令
xargs 默认接 echo,直接输入 xargs 后,会等待用户输入,直到用户输入 ctrl+d,才会结束
$ xargs
abc
def
hik <--- 此处输入完成后回车,ctrl+d
abc def hik <-----显示的结果,将你输入的内容按照空白字符分割(空格,回车换行等),打印出来
-t 显示执行的命令
$ xargs -t # -t 参数:显示执行的命令
abc
123 # 输入了abc和123,ctrl+d结束输入
echo abc 123 # 实际执行的命令是 echo
abc 123
-d 分隔符:分隔符
xargs默认用空格、换行符、制表符等作为分割,把标准输入分割成一个个命令参数
$ echo 'a b c' | xargs
a b c <-- 把上面空格分割,然后打印出来各个参数
自定义分隔:
$ echo 'a b c' | xargs -d 'b' <-- 用字符‘b’分割
a c
-p:用户确认
-p参数可以在执行命令时,弹出确认消息,让用户确认后才会执行相应的命令
$ echo 'a b c' | xargs -d 'b' -p
echo a c
?...y <-- 输入y,确认
a c
-n 数量:指定将几个参数传递给命令
忽略 -n
参数则默认一次性将所有参数传递给后面的命令。
$ echo 'a b c' | xargs -t echo
echo a b c # 执行的是 echo a b c,也就是把所有的参数一次性传递给了echo
a b c
-n 1
将每次传递一个参数,也就是将a b c这三个参数,一个一个的交给echo执行
$ echo 'a b c' | xargs -n 1 -t echo # 设定每次传递1个参数给echo
echo a # 看的出来,就传递了一个a
a
echo b
b
echo c
c
-i str:给参数的值起个变量名 str
, str
可以忽略,默认的变量名是 {}
。官方建议使用大写的 -I
来指定参数。
先ls一下,查看文件
$ ls
aaa chrome.lnk* eclipse.lnk* help.txt name.txt Typora.lnk*
$ ls | xargs -i echo "{} .." # -i 指定参数,没写参数名,则默认使用 {}
aaa ..
chrome.lnk* ..
eclipse.lnk* ..
help.txt ..
name.txt ..
Typora.lnk* ..
-I str:类似 -i
$ ls | xargs -I 'name' echo "name ...." # 将传递的参数命名为 name
aaa ....
chrome.lnk* ....
eclipse.lnk* ....
help.txt ....
name.txt ....
Typora.lnk* ....
-0:以 null
作为分隔符
对比 find
命令有个参数 -print0
,可以将查找的内容以 null 分割(即查找出的所有内容不换行显示),-0
参数可以配合使用
正常的find
$ find -type f
./a b c e.pub # 注意这个名字带有空格的文件
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk
find 命令的 -print0 参数
$ find -type f -print0
./a b c e.pub./aaa./chrome.lnk./eclipse.lnk./help.txt./name.txt./Typora.lnk # 以null分割,每个文件之间没有换行输出
配合xargs使用,名字带有空格的文件,被拆分了!
$ find -type f | xargs -n 1
./a # 文件名有空格,被拆开了
b
c
e.pub
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk
使用 -print0
和 xargs 的 -0
$ find -type f -print0 | xargs -n 1 -0
./a b c e.pub # 文件完好
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk
其实上面这个例子不使用 -0
也可以,比如手动指定分隔符为 \n
,即回车换行符,而不用默认的空白符号:
$ find -type f| xargs -d '\n' -n 1
./a b c e.pub
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk
-L 数量:用几行作为命令参数
-L可以将每行的数据进行分割,然后再把几行的数据重组,作为一个整体传递给下一个命令
下面的例子有三行数据,注意中间的\n
,前两行数据又有很多空格,xargs 将这些行进行分割,然后每几行的参数放到一起,传递给下一个命令(默认是echo,显示消息)
$ printf "a b c\nd e f\nghi" | xargs -L 1
a b c # a b c,一次传递一行参数给echo
d e f
ghi
$ printf "a b c\nd e f\nghi" | xargs -L 2
a b c d e f # 一次性传递了两行
ghi
-P 数量:一次用几个进程执行
-P 0
代表不限制几个进程,-P 2
代表用2个进程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构