管道命令可以将stdout重定向到stdin,但是对于只能接受命令行参数的形式接收数据的命令,无法通过stdin接收数据。此时就需要将stdin转换为后续命令的命令行参数。xargs就是实现这个功能的命令:擅长将stdin的数据转换为命令行参数,也可以将单行或多行文本输入转换为其他格式。
一般编写shell命令都追求单行命令,使用管道符进行连接,如果后续命令需要以命令行参数接收数据,那么xargs就是构建单行命令的重要组件之一。
1.概览
xargs需要紧跟在管道符之后,以stdin作为输入数据源。将接收到的数据重新格式化,然后传给后续需要命令行参数的命令。
2.特性实例
1.将多行输入转换为单行
xargs默认的定界符是空格,每一个参数是由这个定界符分割的。默认xargs可以将换行符去除并用空格分割当做多个参数。
user@ubuntu:~$ echo -e "a b c\nd e"
a b c
d e
user@ubuntu:~$ echo -e "a b c\nd e" | xargs
a b c d e
2.将单行输入转换为多行
xargs的-n选项可以指定每行的参数个数的最大数目。
user@ubuntu:~$ echo -e "a b c d e" | xargs -n 2
a b
c d
e
3.指定分割参数的定界符
-d选项可以用来指定自定义的定界符来分割stdin的输入数据。
user@ubuntu:~$ echo -e "aXbXcXdXe" | xargs -d X tr [:lower:] [:upper:]
A
B
C
D
E
4.指定替换参数
使用-I选项可以指定一个替换字符串,然后在命令行参数中用这个替换字符串来代替参数。
user@ubuntu:~$ echo -e "aXbXcXdXe" | xargs -d X -I {} command-cmd {}
5.结合find
-0参数可以指定\0作为定界符,可以避免很多问题。
user@ubuntu:~$ find . -type f -name "*.bak" -print0 | xargs -0 rm -f
user@ubuntu:~$ find /src -type f -name "*.py" -print0 | xargs -0 wc -l