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

posted on 2015-01-04 22:49  海上不夜星  阅读(105)  评论(0编辑  收藏  举报

导航