一、xargs命令
xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。
xargs的默认命令是echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。
二、options
1. 默认将文件中的多行输出为一行,其中将空白(空格,换行符,制表符)是输入分隔符,空格是输出分隔符
cat xrags.txt a b c d e f g h i j k l m n o p q r s t u v w x y z cat xrags.txt | xargs a b c d e f g h i j k l m n o p q r s t u v w x y z
2. -n: 多行输出,指定每行输出多少个子串
1 cat xrags.txt | xargs -n 3 2 a b c 3 d e f 4 g h i 5 j k l 6 m n o 7 p q r 8 s t u 9 v w x 10 y z
3. -d: 自定义输入分隔符
1 echo "nameXnameXnameXname" | xargs -d X -n 2 2 name name 3 name name
4. -I: 指定替换字符串 {}(只能替换单个子串), 这个字符串在xargs扩展时会被替换掉,当-I与xargs结合使用,每一个参数命令都会被执行一次。
1 cat sk.sh 2 #!/bin/bash 3 #sk.sh 命令内容,打印出所有参数 4 echo $* 5 6 cat arg.txt 7 aaa 8 bbb 9 ccc 10 11 cat arg.txt | xargs -I {} ./sk.sh -p {} -l 12 -p aaa -l 13 -p bbb -l 14 -p ccc -l
5. 与find联合使用
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
find . -type f -print | xargs file 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
find / -name "core" -print | xargs echo "" >/tmp/core.log 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
find . -type f -print | xargs grep "hostname" 用grep命令在所有的普通文件中搜索hostname这个词
find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有东西 (find . -ctime +3 -exec rm -rf {} ;)
find ./ -size 0 | xargs rm -f & 删除文件大小为零的文件
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
6. 子shell
运行一个shell脚本时会启动另一个命令解释器.,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件里的一系列命令。每个shell脚本有效地运行在父shell(parent shell)的一个子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。
1 cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5
1 如果cmd2 是cd /,那么就会改变子Shell的工作目录,这种改变只是局限于子shell内部,cmd5则完全不知道工作目录发生的变化。子shell是嵌在圆括号()内部的命令序列,子Shell内部定义的变量为局部变量。 子shell可用于为一组命令设定临时的环境变量:
1 COMMAND1 2 COMMAND2 3 COMMAND3 4 ( 5 IFS=: 6 PATH=/bin unset 7 TERMINFO 8 set -C 9 shift 5 10 COMMAND4 11 COMMAND5 12 exit 3 # 只是从子shell退出。 13 ) # 父shell不受影响,变量值没有更改。 14 COMMAND6 15 COMMAND7 16 17 来自: http://man.linuxde.net/xargs