代码改变世界

对xargs的简单理解

2012-06-06 10:32  夜幕降临  阅读(369)  评论(0编辑  收藏  举报

man手册

xargs - build and execute command lines from standard input

xargs可以从标准输入建立一个命令行参数

具体用法

1 ls | grep '\.[ch]$' | xargs rm -f

这个命令把当前目录下的文件用ls列出来,然后ls的结果通过管道传递到grep,grep这时从标准输入(第一个管道读端),grep从文件列表中找到那些以.c或者.h结尾的文件。把这些文件名通过标准输出(第二个管道写端)传递到xargs,xargs通过从管道读端接收到的文件拼接成一个命令行参数给rm -f命令,然后rm -f删除找到的文件。

下面这段代码的作用是打印出每个命令行参数的地址和值

 1 #include <stdio.h>
 2 
 3 
 4 int main(int argc, char *argv[])
 5 {
 6     int i = 0;
 7     for(;i < argc; i++){
 8         printf("%p argv[%d] = %s \n", argv+i, i, argv[i]);
 9     }
10 
11     return 0;
12 }

通过把这个命令放在xargs后面可以看出xargs的效果,结果如下

tom@NextZone ~/Code/unix/final/B-Shell $ ls | grep '\.[ch]$' | xargs ./argv
0x7fff6c873988 argv[0] = ./argv 
0x7fff6c873990 argv[1] = argv.c 
0x7fff6c873998 argv[2] = error.c 
0x7fff6c8739a0 argv[3] = myvar.c 
0x7fff6c8739a8 argv[4] = redir.c 
0x7fff6c8739b0 argv[5] = while.c 

可以看出xargs把找到的文件拼接成一个个参数传递给我们的程序。

可以说xargs加强的管道的力量,把那些不能不能处理标准输入的程序也融合到管道里面。