xargs命令

来源:互联网 发布:php bug管理系统 编辑:程序博客网 时间:2024/04/23 22:56

在linux下:
2 l2 q4 f3 K7 N2 nfind . -name "*.o" -print | rm -f
) _# M5 T% N  E/ D: Z这个命令为什么不行呢,管道为什么在这里没有用啊?而必须加上xargs或者-exec呢?

要用管道必须搞清楚标准输入和标准输出的概念。
! _3 \( j! K8 T3 h9 f
: `* _8 e- }& u8 N8 w* `如果对编程不怎么了解,那么就简单理解:以简单方式执行一个命令(没有管道、改向),标准输入一般就是你从键盘输入的内容,输入输出就是显示在命令运行的终端上的内容(不含另外弹出的窗口中的内容),大部分情况标准输入等同于键盘输入,但有些程序会绕过标准输入接口去读键盘输入;端口输出除了标准输出的内容外,还常常标准错误的内容,一般可能会把出错信息和提示用户输入数据的信息从标准错误输出,但也不全是,可以在使用的过程观察体会。: c6 {: r& @. E) Q+ S. R/ y3 E

0 G3 ~6 n; _- r0 Q4 C) I9 ?而管道的作用就是把管道前命令标准输出内容作为管道后命令的标准输入。也就是后一条命令执行时本来去读键盘的,改为直接去读前一条命令的输出。! P! \2 r" S5 u' c

& S: c! v  h4 t) T. o* R9 P5 _如果你直接执行 rm -f,会报错,而不是等待你从键盘输入要删除的文件名,也就是说 rm 不会读取标准输入,所以不能用管道把要删除的文件名送给 rm。* R* z) x/ S" q0 [
$ k( Y. J6 ?: s
xargs 命令的作用就是读取标准输入,然后把它读到的内容作为命令行参数去执行指定的命令。所以在 rm 前加 xargs 就可以了,这时 find 输出送给了 xargs,由 xargs 去调用 rm,xargs 调用 rm 时会帮它“组装”命令行参数。8 r% d7 _/ w* g) @4 r, Y/ [

5 \+ e/ ?: v- c: V加 -exec 的是另一种情况,不用管道,跟标准输入和标准输出无关,它完全是 find 这条命令的用法,人家就是这么设计的。

find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print   find命令将匹配的文件输出到标准输出。

 

xargs命令的作用就是将上一个命令的结果,作为xargs后面命令的参数来使用。

命令对比:
1、假设当前目录下有111.txt和222.txt两个文件

find -name 111.txt | ls -la

搜索出来的结果和ls -la命令执行结果一样。

find -name 111.txt | xargs ls -la

搜索出来的结果只有111.txt信息。

第二句find语句将前面的结果作为了ls -la的参数,ls -la 111.txt。

2、在当前目录下搜索以.c结尾的文件

find . -name "*.c" | grep SetMessage

搜索出来的是一个叫SetMessage.c的文件。

find . -name "*.c" | xargs grep SetMessage

搜索出来的是在某个.c中有SetMessage函数定义。

第一个find语句是grep从管道出来的结果集中去找SetMessage的内容。
第二个find语句是将管道出来的结果作为grep的参数,比如结果里有1.c、2.c、SetMessage.c,命令就变成
grep SetMessage 1.c 2.c SetMessage.c
后来在2.c中找到SetMessage函数定义。

 

0 0
原创粉丝点击