7. xargs
xargs 命令应该紧跟在管道操作符之后。它以标准输入作为主要的源数据流,并使用stdin并通过提供
命令行参数来执行其他命令。例如:
command | xargs
xargs可以作为一种替换方式,作用类似于find命令中的 -exec 参数。下面介绍一些借助xargs 命令能够
实现的技巧。
一. 将多行输入转换成单行输出。
只需要将换行符移除,再用“ ” (空格)进行代替,就可以实现多行输入的转换。
cat example.txt
1 2 3 4 5 6
7 8 9 10
11 12
则:
cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12
二. 将单行输入转换成多行输出
指定每行最大的参数数量n, 我们可以将任何来自stdin的文本划分成多行,每行n个参数。每一个参数都是由“ ” (空格)隔开的字符串。空格是默认的定界符,依照下面的方法可以将单行划分成多行:
cat example.txt | xargs -n 3
工作原理:
我们可以用自己的定界符来分隔参数。用-d选项作为输入指定一个定制的定界符
echo "splitXsplitXsplitXsplit" | xargs -d X
默认情况下,xargs采用内部字段分隔符(IFS)作为输入定界符。
1.读取stdin, 将格式化参数传递给命令
cat args.txt
arg1
arg2
arg3
cat args.txt | xargs -n 1 ./cecho.sh
在这个例子中,我们直接为特定的命令提供命令行参数。但实际上除了他们外,我们还需要一些固定不变的参数,如:
./cecho.sh -p arg1 -l
xargs有一个选项-I,我们可以用-I指定一个替换字符串,这个字符串会在xargs扩展的时候被替换掉。
cat args.txt | xargs -I {} ./cecho.sh -p {} -l
cat args.txt | xargs -n 2 | xarg -I {} ./cecho -p {} -l
2. 结合find使用xargs
xargs 和 find 算是一对死党。两者结合使用可以让任务变得更轻松。不过人们却通常以一种错误的组合方式使用它们。例如:
find . -type f -name "*.txt" -print | xargs rm -f
这样做很危险。有时可能会删除不必要删除的文件。我们没法预测分隔find命令输出结果的定界符究竟是'\n' 还是 ' '.
很多文件名中都包行有空格符,而xargs很可能会误以为它们是定界符。
只要我们把find 的输出作为xargs的输入,就必须将-print0 与 find 结合使用,以字符null来分隔输出。
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
这样就可以删除所有的.txt文件。 xargs -0 将 \0 作为输入定界符。
3. 统计源代码中所有c程序文件的行数。
统计c程序文件的行数是大多数程序员都会遇到的活儿
find path -type f -name "*.c" -print0 | xargs -0 wc -l