Linux xargs命令:给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具

xargs命令来自于英文词组"extended arguments"的缩写,其功能是用于给其他命令传参数的过滤器;
xargs命令能够处理从标准输入或管道符输入的数据,并将其转换成命令参数。也可以将单行或多行输入的文本转换成其他格式;
xargs命令可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行;
xargs命令默认接收的信息中,空格是默认定界符,所以可以接收包含换行和空白的内容;
xargs命令是构建单行命令的重要组件之一。

1、功能说明

给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具

2、语法格式

xargs [选项]

3、选项解释

  • -n 多行输出,指定每行的最大参数量n,可以将标准输入的文本划分为多行,每行n个参数,默认空格分割
  • -d 自定义分割符
  • -i 以{}替代前面的结果
  • -I 指定一个符号替换替代前面的结果
  • -t 打印出 xargs 执行的命令
  • -p 执行每一个命令时弹出确认,y执行 n不执行
  • -0 用null代替空格作为分割符,配合find命令的-print0选项的输出使用

4、参考实例

准备数据test3.txt
hello world welcome learn
ma nong xin rui
good good learn
day day up

多行输入单行输出

[root@bunian ~]# xargs < test3.txt 
[root@bunian ~]# cat test3.txt | xargs  //两个命令效果是一样的
hello world welcome learn bu nian blog good good learn day day up

打印出xargs 执行的命令

[root@bunian ~]# cat test3.txt | xargs -t
/bin/echo hello world welcome learn bu nian blog good good learn day day up
hello world welcome learn bu nian blog good good learn day day up

使用 -n 进行多行输出

[root@bunian ~]# xargs -n 3 < test3.txt
[root@bunian ~]# cat test3.txt|xargs -n3
hello world welcome
learn bu nian 
blog good
good learn day
day up

使用-d选项 可以自定义一个分割符

[root@bunian ~]# echo "name=name=name=name"|xargs -d =  //以=号做分割符
name name name name

结合-n使用,规定输出的行数

[root@bunian ~]# echo "name=name=name=name"|xargs -d = -n 2 //以=号做分割符
name name
name name

设定每一次输出信息时,都需要用户手动确认后再显示到终端界面

[root@bunian ~]# echo "name=name=name=name"|xargs -d= -n 2 -p
echo name name ?...
echo name name
?...
echo ?...

用符号{}替代前面输出的结果

[root@bunian ~]# cat test3.txt |xargs -i echo {}
hello world welcome learn
bu nian blog
good good learn
day day up

指定符号替代前面输出的结果

[root@bunian ~]# cat test3.txt |xargs -I [] echo []
hello world welcome learn
bu nian blog
good good learn
day day up

5、补充说明

参数-i只能用符号{}替代前面输出的结果,
而参数-I是可以指定符号替代前面输出的结果。
建议用-I,因为有些系统不支持-i

>  会覆盖目标的原有内容。当文件存在时会先删除原文件,再重新创建文件,然后把内容写入该文件;否则直接创建文件。
>> 会在目标原有内容后追加内容。当文件存在时直接在文件末尾进行内容追加,不会删除原文件;否则直接创建文件。
<  表示的是输入重定向的意思,就是把<后面跟的文件取代键盘作为新的输入设备。
|  表示一个管道的意思,可以理解为东西从管道的一边流向另外一

6、拓展命令

复制所有图片文件到/local/images目录下:
  ls *.jpg | xargs -n1 -I {} cp {} /local/images
  
把日志移动到特定目录下
  find . -name "*.log" | xargs -I {} mv {} test
  
统计一个源代码目录中所有java文件的行数
  find . -type f -name "*.java" -print0 | xargs -0 wc -l
  
查找所有的后缀是.log文件,并且压缩它们
  find . -type f -name "*.log" -print | xargs tar -czvf log.tar.gz

7、后言

拓展命令中用到了find命令,这也是个很重要很常用的命令,本站有find命令详解。

© 版权声明
THE END