[原创]在文件夹中查找指定字符串的文件_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3022 | 回复: 0   主题: [原创]在文件夹中查找指定字符串的文件        下一篇 
wulcan
版主
等级:中校
经验:1795
发帖:124
精华:0
注册:2014-3-19
状态:离线
发送短消息息给wulcan 加好友    发送短消息息给wulcan 发消息
发表于: IP:您无权察看 2014-9-25 8:02:54 | [全部帖] [楼主帖] 楼主

在读源代码的时候,经常需要知道某一个函数或对象是在哪个文件中定义的,也许某个目录下有上千个文件,手动查找不是很现实。

在windows中,可以用“搜索”来查找某个目录下,到底有哪些文件包含指定的字符串,在Linux/Unix的命令行下,就没有那么直观了。

但是,实现这个功能却不难,稍微组合一下命令就可以实现,比如,在/home/src中查找mytest函数,可以用下面的命令:

find /home/src –name “*” –exec grep “function mytest” –nH {} \;


看起来很复杂的样子,大致解释一下:

(1)find本身是查找命令,但是它可以把查找到的结果重新定向到其他命令。对查找到的结果运行某一个程序,就可以用-exec的子命令(参数)。

-exec 是运行一个程序,并且把find的结果作为它的一个参数。由于运行的程序需要的参数位置可能不固定,有的参数在前面,有的参数在后面,还有的参数在其他参数中间。所以find用{}来占位,具体执行的时候,会把{}替换成查找到的结果。具体的解释可以见find的手册。

(2)“*”的星号,代表所有文件,你可以把这部分替换一下,比如仅查找所有的php文件,则用“*php”,注意最好不要沿用windows的习惯,写成“*.php”,Linux/Unix下不需要那个句号。同时还要注意,星号必须加引号,或者用转义,否则会显示命令错误。

(3)grep后面的内容,如果中间有空格,也一定要用引号引起来,否则会被当成多个参数对待,从而导致语法错误或错误的结果。

(4)-nH是grep的参数,表示显示文件名和行号,详细可参考grep的资料,否则仅显示你要查找的行,而不显示文件名和行号。我们查找内容,一般都希望显示出文件名和行号,否则查找干什么呢?

(5)最后一个分号前的反斜杠就是惯例的转义���,其实就是分号而已,表示find命令的结束。

最后,给一个示例,顺便看一下加-nH参数的区别:

test@aaa # find /etc -name "*.conf" -exec grep pccard_ether {} \;
# script is called pccard_ether.
action "/etc/pccard_ether $subsystem start";
action "/etc/pccard_ether $device-name stop";
action "/etc/pccard_ether $device-name start";
action "/etc/pccard_ether $device-name start";
action "/etc/pccard_ether $device-name stop";
test@aaa # find /etc -name "*.conf" -exec grep -nH pccard_ether {} \;
/etc/devd.conf:32:# script is called pccard_ether.
/etc/devd.conf:42: action "/etc/pccard_ether $subsystem start";
/etc/devd.conf:65: action "/etc/pccard_ether $device-name stop";
/etc/devd.conf:69: action "/etc/pccard_ether $device-name start";
/etc/devd.conf:281: action "/etc/pccard_ether $device-name start";
/etc/devd.conf:285: action "/etc/pccard_ether $device-name stop";


该贴由hui.chen转至本版2014-11-5 17:04:54



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论