bash黑客都喜欢单行命令——命令间并不用分好链接,而是使用链接操作符进行连接。
xrags把从stdin就收到的数据重新格式化。在座位参数提供给其他命令。
将多行数据单行输出:
$cat example.txt
1
2
3
456
$cat example.txt | xargs
1 2 3 4 5 6
将单行数据多行输出
$cat example.txt | xargs -n 3
以每行3个数字(空格为界定符)
自己定义界定符:
$ echo “spiltxspiltxspilt” | xargs -d “x” -n 2
spilt spilt
spilt
读取stdin,将格式化参数传递给命令
我们这里编写一个定制版echo脚本
#!/bin/bash
#FIlename:cecho.sh
echo $*’#’
我们可以手动将三个参数arg1,arg2,arg3传给cecho.sh
那如何利用xargs呢?
$ cat args.txt
args1
args2
args3
每次执行一次参数:
$cat args.txt | xargs -n 1 ./cecho.sh
args1 #
args2 #
args3 #
每次执行两个参数:
$cat args.txt | xargs -n 2 ./cecho.sh
args1 args2 #
args3 #
全部执行:
$cat args.txt | xargs ./cecho.sh
args1 args2 args3 #
假如我们需要参数中有的参数是可变的,有的是不可变的怎么办?
例如我们希望输出格式如下:
./cecho.sh www arg1 xxoo
其中www和xxoo是不可变的,arg1是可变的。
$cat args.txt | xargs -I {} ./cecho.sh www {} xxoo
www arg1 xxoo
www arg2 xxoo
www arg3 xxoo
-I {} 指定了替换字符串。使用-I时,命令就像是在一个循环中一样,有几个参数就会执行几次。
find与xargs结合
$find . type f -name “*.txt” -print | xargs rm -f
找出后缀.txt的文件并删除
但是这样做很危险,因为我们不知道find的分割符是什么?是’\n’还是“ ” 。
(例如 hell text.txt会被xargs误认为是hell 和 text.txt)
这是我们就需要利用 -print0与find进行结合。以保证文件文件间是以null间隔的。
$find . type f -name “*.txt” -print0| xargs -0 rm -f
统计源代码目录下C程序文件的行数
$ find C_path -type f -iname “*.c” -print0 | xargs -0 wc -l