红联Linux门户
Linux帮助

这个find命令为什么不行啊

发布时间:2010-05-20 23:43:30来源:红联作者:babyusher
在linux下:
find . -name "*.o" -print | rm -f
这个命令为什么不行呢,管道为什么在这里没有用啊?而必须加上xargs或者-exec呢?
文章评论

共有 2 条评论

  1. zing840828 于 2011-01-13 11:04:50发表:

    呵呵!看上去不错!

  2. acrofox 于 2010-05-21 12:49:08发表:

    要用管道必须搞清楚标准输入和标准输出的概念。

    如果对编程不怎么了解,那么就简单理解:以简单方式执行一个命令(没有管道、改向),标准输入一般就是你从键盘输入的内容,输入输出就是显示在命令运行的终端上的内容(不含另外弹出的窗口中的内容),大部分情况标准输入等同于键盘输入,但有些程序会绕过标准输入接口去读键盘输入;端口输出除了标准输出的内容外,还常常标准错误的内容,一般可能会把出错信息和提示用户输入数据的信息从标准错误输出,但也不全是,可以在使用的过程观察体会。

    而管道的作用就是把管道前命令标准输出内容作为管道后命令的标准输入。也就是后一条命令执行时本来去读键盘的,改为直接去读前一条命令的输出。

    如果你直接执行 rm -f,会报错,而不是等待你从键盘输入要删除的文件名,也就是说 rm 不会读取标准输入,所以不能用管道把要删除的文件名送给 rm。

    xargs 命令的作用就是读取标准输入,然后把它读到的内容作为命令行参数去执行指定的命令。所以在 rm 前加 xargs 就可以了,这时 find 输出送给了 xargs,由 xargs 去调用 rm,xargs 调用 rm 时会帮它“组装”命令行参数。

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