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版》第二章

shell学习(20)- xargs的更多相关文章

  1. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  2. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  3. (转)Shell学习之Shift的用法

    Shell学习之Shift的用法 原文:https://www.cnblogs.com/sunfie/p/5943753.html 位置参数可以用shift命令左移.比如shift 3表示原来的$4现 ...

  4. Shell学习(七)——sort、uniq、cut、wc命令详解

    Shell学习(七)--sort.uniq.cut.wc命令详解 转自:[1]linux sort,uniq,cut,wc命令详解 https://www.cnblogs.com/ggjucheng/ ...

  5. shell学习总结之自定义函数

    shell学习总结之自定义函数 Myfun (){ echo -n "now i is $i " ! [ "$i" ] && exit ; ec ...

  6. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  7. OpenCV学习(20) grabcut分割算法

    http://www.cnblogs.com/mikewolf2002/p/3330390.html OpenCV学习(20) grabcut分割算法 在OpenCV中,实现了grabcut分割算法, ...

  8. shell学习指南-阅读笔记

    shell学习指南真不是刚开始学习shell应该看得书,虽然其中讲了简单的linux命令,shell语法等,但是每章也有些深入和生僻地方,我想如果我刚学shell看到这样的地方一定会头疼的要死.或许也 ...

  9. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

随机推荐

  1. Linux时间设置命令

    1.date: 语法格式:date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=dates ...

  2. 如何提高英语听力(内容摘自NECCS)+ 乘法表

    乘法表 print('\n'.join([' '.join(['%s*%s=%-2s'%(y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]) ...

  3. Luogu P1073 最优贸易(最短路)

    P1073 最优贸易 题意 题目描述 \(C\)国有\(n\)个大城市和\(m\)条道路,每条道路连接这\(n\)个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这\(m\)条道路中有 ...

  4. openCV抠图实验

    #include "pch.h" #include <opencv2/core/core.hpp> #include "opencv2/imgproc/img ...

  5. 常见任务&基本工具 1 软件包管理

    打包系统主要有两个阵营 包文件的简介 Package files are created by a person known as a package maintainer, often (but n ...

  6. CF 848C

    听说,一个好的oier是题目喂出来的. 题目 给定长度为n的数组, 定义数字X在[l,r]内的值为数字X在[l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m次询问, 每次询问有三个整数 ...

  7. Flask – SQLAlchemy成员增加

    目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 home主页 添加成员addnew.html 展示页show_all 简介 结构 $ tree -I "__pyca ...

  8. JDBC入门案例

    什么是JDBC? JDBC的全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的Java API. 作为一个Web开发人员来说,JDBC操作是 ...

  9. mybatis的第一个程序

    程序结构图: 表结构: 创表sql: CREATE TABLE `users` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `username` varch ...

  10. qq在线

    <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=1749904992&site=q ...