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

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

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

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

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

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

命令格式:

  1. somecommand |xargs -item command

参数:

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

工作原理

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

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

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

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

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

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

4.和find一起使用

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

  1. find /smbMount -iname '*.docx' -print0 | xargs - grep -L image
xargs和find可以配合完成任务。不过在结合使用的时候需要留心。考虑下面的例子:
  1. 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文件:
  1. find . -type f -name "*.txt" -print0 | xargs - rm -f

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

  1. find . -type f -name "*.php" -print0 | xargs - wc -l
  1. find . -type f -name '黑名单普通' -print0 | xargs - wc -l
  2. find . -type f -name '*黑名单普通*' -print0 | xargs - wc -l
  3. find . -type f -name '*黑名单普通*' -print0 | xargs - rm \{};
  4. find . -type f -name '*黑名单普通*' -print0 | xargs - rm {} \;
  5. find . -type f -name '*黑名单普通*'| xargs rm {} \;
  6. find . -type f -name '*黑名单普通*' rm {} \;
  7. find . -type f -name "*黑名单普通*" rm {} \;
  8. find . -type f -name "*黑名单普通*" -print0 | xargs - rm -f

5.-I选项

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

  1. cat arg.txt | xargs -I {} ./sk.sh -p {} -l
  2.  
  3. -p aaa -l
  4. -p bbb -l
  5. -p ccc -l
 
复制所有图片文件到 /data/images 目录下:
  1. 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. CI框架--URL路径跳转与传值

    CI框架使用URL的前提是需要加载辅助函数$this->load->helper('url');当然我建议大家将所有需要加载的东西写在构造方法内,这样就不需每个控制器每个方法都去调用一次了 ...

  2. 多机MySQL一主双从详细安装主从复制

    多机MySQL一主双从详细安装 一.复制的工作原理 要想实现AB复制,那么前提是master上必须要开启二进制日志 1.首先master将数据更新记录到二进制日志文件 2.从slave start开始 ...

  3. 开户项目的sql查询语句备查

    查询全国所有的券商名录 SELECT id,security,province,city,borough FROM t_security GROUP BY security ; 查询某个省份的所有券商 ...

  4. php 获取一张图片所有点的颜色值

    image_all_rgb.php <?php //similar_text($numStr, $val, $pre); //计算两个字符串的相似度 //print_r($pre); $imgP ...

  5. Codevs1922 骑士共存问题

    1922 骑士共存问题 题目描述 Description 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国 ...

  6. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  7. javascript之键盘事件的方法

    键盘事件包含onkeydown.onkeypress和onkeyup这三个事件 事件初始化 function keyDown(){} document.onkeydown = keyDown; //论 ...

  8. 使用Data Lake Analytics + OSS分析CSV格式的TPC-H数据集

    0. Data Lake Analytics(DLA)简介 关于Data Lake的概念,更多阅读可以参考:https://en.wikipedia.org/wiki/Data_lake 以及AWS和 ...

  9. Django项目:CRM(客户关系管理系统)--01--01PerfectCRM基本配置ADMIN01

    一.CRM项目需求 二.CRM项目新建 PerfectCRM crm

  10. webpack--安装,使用

    1. webpack 1.1. webpack介绍 webpack是一个资源的打包工具,目前最新为webpack3,可以将 .js, .css , image等静态资源当做一个模块来进行打包,那么每一 ...