Linux学习: xargs 命令
xargs ,execute arguments ,从名字看它就是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具,它擅长将标准输入数据转换成命令行采纳数,在并行中非常有用。本文汇总网络的资料
1 为什么要用xargs
有的命令可以接收标注输入(stdin)。如cat。
#cat的输出可以通过管道作为grep的参数。
$ cat gene.gff | grep transcript
多数的命令是无法接收管道传递的参数。如echo,rm ,mkdir和ls
$ echo "hello world" | echo # 什么都没有输出
find /sbin -perm +700 |ls -l #这个命令是错误的
find /sbin -perm +700 |xargs ls -l #这样才是正确的
2 xargs和管道(|)的使用
xargs是将标准输入转为命令行参数。
$ command |xargs -options command
$ echo "hello world" | xargs echo # 通过xargs捕捉管道上的输出作为echo的参数
$ echo "one two three" | xargs mkdir # 新建3个文件
3 xarge的参数 -d
-d 表示更改分隔符。默认的xargs分隔符是回车,argument的分隔符是空格。
$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c
$echo "nameXnameXnameXname" | xargs -dX
name name name name
4 xarge的参数 -p,-t
-p参数打印出要执行的命令,询问用户是否要执行(增加安全性)
$ echo 'one two three' | xargs -p touch
touch one two three ?...
-t参数则是打印出最终要执行的命令,然后再执行,不需要用户确认。
$ echo 'one two three' | xargs -t rm
rm one two three
5 xargs -L参数
如果标准输入包含多行,-L参数指定多少行作为一个命令行参数。
$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c
6 xargs -n 参数
如果需要同一行输入多项可以使用-n。-n加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9
使用-n进行格式的转换
cat test.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 test.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
cat test.txt | xargs -n3
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
7 xargs -I 参数
如果xargs要将命令行参数传给多个命令,可以使用-I参数。如果命令后面可以跟内容,且没有目的路径的时候,可以省略-i。将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。
$ ls *.jpg | xargs -n1 -I {} cp {} /data/images
$ ls *.txt |xargs -t -i mv {} {}.bak
8 xargs的 -P --max-procs参数
xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。
--max-procs参数指定同时用多少个进程并行执行命令。--max-procs 2表示同时最多使用两个进程,--max-procs 0表示不限制进程数。
9 xargs的-E选项
遇到就停止。该选项指定一个字符串,当xargs解析出多个命令行参数的时候,如果搜索到-e指定的命令行参数,则只会将-e指定的命令行参数之前的参数(不包括-e指定的这个参数)传递给xargs后面的命令。
echo '11 22 33' | xargs -E '33' echo
#可以看到正常情况下有3个命令行参数 11、22、33 由于使用了-E '33' 表示在将命令行参数 33 之前的参数传递给执行的命令,33本身不传递。等价于 echo 11 22 这里-E实际上有搜索的作用,表示只取xargs读到的命令行参数前面的某些部分给命令执行。