免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2618 | 回复: 4

新手的一点心得,关于find和管道 [复制链接]

论坛徽章:
0
发表于 2006-10-24 10:30 |显示全部楼层
要做一件很简单的操作,在某目录下查找一个文件,把它的路径打出来。
该文件的路径是"*/config/software",前面的目录层不定,只有文件名和最后一级目录是确定的,但是大小写又是不确定的。

先试验一下:

  1. #!/bin/sh

  2. find /mydir -type f -ipath "*/config/software"
复制代码

这个脚本跑起来挺正常,只是因为/mydir目录里文件太多,整个查找过程要花6秒,
而实际上第一秒时已经找到文件了。
现在改进一下---找到第一个匹配目标就退出:

  1. #!/bin/sh

  2. find /mydir -type f -ipath "*/config/software" | while read line
  3. do
  4.         echo "$line"
  5.         break
  6. done
复制代码

但这个脚本并没有像预想的那样1秒钟输出结果并退出,而是运行了6秒钟才输出结果并退出。
这是怎么回事呢?查了半天,终于明白,问题出在管道上。
find的输出并没有立即传给read,而是放在缓冲区里,直到缓冲区填满或者find结束才传过去。
在这个例子里,输出的只是一个文件路径,远远达不到填满缓冲区的要求,所以直到find结束,read才得到输入。
于是又man find,发现可以用printf "\c"来flush输出,就又改了一下:

  1. #!/bin/sh

  2. find /mydir -type f -ipath "*/config/software" -print -printf "\c" | while read line
  3. do
  4.         echo "$line"
  5.         break
  6. done
复制代码

这回倒是一秒钟就输出了,可是整个脚本却等了6秒才结束。
为什么呢,我现在也没搞懂,好像是break没能把find中止,请大家指点。
于是又搜索了一下如何杀掉子进程的帖子,拷了一些代码过来:

  1. #!/bin/sh

  2. find /mydir -type f -ipath "*/config/software" -print -printf "\c" | while read line
  3. do
  4.         pidfind=`ps --ppid $$ | grep "find" | awk '{ print $1}'`
  5.         if [ $pidfind ]
  6.         then
  7.         kill -9 $pidfind
  8.         fi
  9.        
  10.         echo "$line"
  11.         break
  12. done
复制代码

查到结果后把find给kill掉,这回总算能按预想的运行了,运行1秒钟输出结果并退出。
可是我总觉得这种杀进程的方法不正规。
请问大家,有什么好办法来实现:查找文件时找到第一个匹配结果时就停止查找?

论坛徽章:
0
发表于 2006-10-24 11:16 |显示全部楼层
先 u p 一下再看

论坛徽章:
0
发表于 2006-10-24 12:10 |显示全部楼层
  1. find /mydir -type f -ipath "*/config/software" -print -quit
复制代码

论坛徽章:
0
发表于 2006-10-24 12:38 |显示全部楼层
原帖由 seeLnd 于 2006-10-24 12:10 发表
  1. find /mydir -type f -ipath "*/config/software" -print -quit
复制代码


多谢指点!
可是我这里的GNU find v4.1.20不支持-quit

论坛徽章:
0
发表于 2006-10-24 14:08 |显示全部楼层
偶只知道按Ctrl-C
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP