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

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。

xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

xargs命令重新格式化stdin接收到的数据,再将其作为参数提供给指定命令。xargs默认会执行echo命令。和find命令的-exec选项相比,两者在很多方面都相似。
 
 

命令格式:

somecommand |xargs -item  command

参数:

-a file 从文件中读入作为sdtin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。

工作原理

xargs命令接受来自stdin的输入,将数据解析成单个元素,然后调用指定命令并将这些元素作为该命令的参数。xargs默认使用空白字符分割输入并执行/bin/echo

1.将多行输入转换成单行输出

[kumufengchun@localhost ~/shell]$ cat example.txt

[kumufengchun@localhost ~/shell]$ cat example.txt | xargs
         

2.将单行输入转换成多行输出

xargs的-n选项可以限制每次调用命令时用到的参数个数。下面的命令将输入分割成多行,每行N个元素

[kumufengchun@localhost ~/shell]$ cat example.txt | xargs -n 
3.-d选项可以为输入数据指定自定义的分隔符
[kumufengchun@localhost ~/shell]$ echo "split1xsplit2xsplit3xsplit4" | xargs -d x
split1 split2 split3 split4 [kumufengchun@localhost ~/shell]$ echo "split1xsplit2xsplit3xsplit4" | xargs -d x -n
split1 split2
split3 split4

4.和find一起使用

xargs命令可以同find命令很好地结合在一起。find的输出可以通过管道传给xargs,由后者执行-exec选项所无法处理的复杂操作。如果文件系统的有些文件名中包含空格,find命令的-print0选项可以使用0(NULL)来分隔查找到的元素,然后再用xargs对应的-0选项进行解析。下面的例子在Samba挂载的文件系统中搜索.docx文件,这些文件名中通常会包含大写字母和空格。其中使用了grep找出内容中不包含image的文件:

find /smbMount -iname '*.docx' -print0 | xargs - grep -L image
xargs和find可以配合完成任务。不过在结合使用的时候需要留心。考虑下面的例子:
find . -type f -name "*.txt" -print | xargs rm -f
这样做很危险,有可能会误删文件。我们无法预测find命令输出的分隔符究竟是什么(究竟是'\n'还是' ')。如果有文件名中包含空格符(' '),xargs会将其误认为是分隔符。例如,bashrc text.txt会被视为bashrc和text.txt。因此上面的命令不会删除bashrc text.txt,而是会把bashrc删除。使用find命令的-print0选项生成以空字符('\0')作为分隔符的输出,然后将其作为xargs命令的输入。
下列命令会查找并删除所有的.txt文件:
find . -type f -name "*.txt" -print0 | xargs - rm -f

统计一个源代码目录中所有 php 文件的行数:

find . -type f -name "*.php" -print0 | xargs - wc -l
    find . -type f -name '黑名单普通' -print0 | xargs - wc -l
find . -type f -name '*黑名单普通*' -print0 | xargs - wc -l
find . -type f -name '*黑名单普通*' -print0 | xargs - rm \{};
find . -type f -name '*黑名单普通*' -print0 | xargs - rm {} \;
find . -type f -name '*黑名单普通*'| xargs rm {} \;
find . -type f -name '*黑名单普通*' rm {} \;
find . -type f -name "*黑名单普通*" rm {} \;
find . -type f -name "*黑名单普通*" -print0 | xargs - rm -f

5.-I选项

xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次,使用-I的时候,命令以循环的方式执行。如果有3个参数,那么命令就会同{}一起被执行3次。{}会在每次执行中被替换为相应的参数

cat arg.txt | xargs -I {} ./sk.sh -p {} -l

-p aaa -l
-p bbb -l
-p ccc -l
 
复制所有图片文件到 /data/images 目录下:
ls *.jpg | xargs -n1 -I {} cp {} /data/images

参考:https://www.runoob.com/linux/linux-comm-xargs.html

《Linux_Shell脚本攻略.第3版》第二章

最新文章

  1. HTML5移动Web开发(一)——HTML5和移动网站基本概念以及一些模拟器
  2. 如何查看经过编码的cookie?
  3. RedHat不能使用ifconfig命令
  4. Android Studio调试功能使用总结
  5. "Your local changes to the following files would be overwritten by merge" on git
  6. ZOJ 1111 Poker Hands
  7. Head First SQL笔记
  8. 决策树ID3算法
  9. 表达式求值(二叉树方法/C++语言描述)(二)
  10. 如何运用GitHub来提高生产效率
  11. unity中调用其他脚本函数的方法(小白之路)
  12. [Luogu 2817]宋荣子的城堡
  13. 关键字(3):order by/group by/having/where/sum/count(*)...查询结果筛选关键字
  14. Redis(转)
  15. SQL语句中单引号、双引号和反引号的区分
  16. memalign的作用【转】
  17. 10.18号java课后动手动脑
  18. reload maven project' has encountered a proble" 问题
  19. window系统使用tftp下载和上传文件
  20. Python 字典的增删改查

热门文章

  1. 【python之路33】开发模式单例模式及简单的服务器请求框架原理
  2. Java过滤器—Filter用法简介
  3. 服务器安装软件时提示Error launching installer
  4. JAVA--养成好的编程习惯
  5. idea中使用本地jar包
  6. 基于python爬虫的github-exploitdb漏洞库监控与下载
  7. 【洛谷P3131】 【USACO16JAN】子共七
  8. kubernetes1.5即将发布
  9. C# 通过URL得到图片的问题
  10. 2018-12-27-WPF-从文件创建图片的方法