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