xargs命令用于传递参数.对传递进来的多个参数,逐个调用命令来执行这个参数.
默认格式,尾部拼接
使用格式:
argu1 argu2 argu3 ... argun | xargs <command>
xargs 会将参数 argu1 ... argun 逐个传递给<command> 来执行,实际执行的过程是:
<command> argu1;
<command> argu2;
...
<command> argun;
即参数会与命令拼接在一起.
"-I replstr"选项,引用传递进来的参数
有时候这不是想要的结果比如:要把n个文件移到目录 tmp/中,下面的命令显然不是想要的结果.
file1 file2 file3 ... filen |xargs mv tmp/
它实际上会是这样来执行的:
mv tmp/ file1;
...
mv tmp/ filen;
这刚好与目的相反.这进需要用到选项 "-I replstr" , 这个选项的作用是将传递的参数用 " replstr" 替换. 在<command> 中就可以使用这个"replstr"变量.
重写上面的命令:
file1 file2 file3 ... filen |xargs -I % mv % tmp/;
当然,% 可以用别的字符串替换,比如"hello,world".
"-L max-lines" 选项,控制参数传递的个数
xargs 还可以控制每次传递进来的参数的个数.使用选项" -L max-lines".
file1 file2 file3 ... filen |xargs -L 3 -I % mv % tmp/;
实际执行会是:
mv file1 file2 file3 tmp/;
...
mv file3k+1 file3k+2 file3k+3 tmp/;
"-a file",从文件中读取参数
上面的例子都是从管道读取参数,使用"-a file" 选项可以从文件中读取参数.
下面的几个选项可以控制文件的结构,即可以指定分隔符(-d delim),文件结束符(-E eofstr).由分隔符(delim)来分隔每一个参数,由文件结束符(eofstr)指定文件结束.那么参数文件应该是下面的结构.
argu1 <delim> argu2 <delim> argu3 <delim> argu4 ... <delim> argun <eofstr> argun+1 <delim> argun+2 <delim>... argun+m
前面的n个参数会被读取,后面的参数将会被丢弃.