![如何在文件中查找文本并让它搜索多个子文件夹?](https://linux22.com/image/16393/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%96%87%E6%9C%AC%E5%B9%B6%E8%AE%A9%E5%AE%83%E6%90%9C%E7%B4%A2%E5%A4%9A%E4%B8%AA%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%9F.png)
我正在寻找一个函数名称,并且文件夹结构很深,并且有很多文件需要查看。
通常我会选择类似的方法,find * | grep functionname
但这是最好的方法吗?
答案1
$ find . -type f -print0 | xargs -0 grep foo
$ grep -r foo . # GNU grep only
并zsh
与setopt extendedglob
,
$ grep foo **/*(.)
答案2
还有ack
,它是专门为此类任务设计的,并自动执行子文件夹搜索。
答案3
作为响应的替代方案find | xargs
,您可以考虑使用标签因为你说你不是在搜索文本,而是专门搜索函数名称。
为此,您需要ctags
针对源代码运行来创建一个TAGS
文件,然后grep
针对该文件运行该TAGS
文件,该文件将以以下格式输出行:
{tagname}<Tab>{tagfile}<Tab>{tagaddress}
其中tagname
包含函数名称,tagfile
是它所在的文件,并且tagaddress
是到达该行的 vi 命令。 (可能只是一个行号。)
(有没有一种简单的方法可以对 Eclipse 构建的各种索引执行类似的操作,或者只是查询 Eclipse 数据库?)
答案4
find . | xargs grep
对于带有空格的文件名将失败:
> echo test > "a b c"
> find . | xargs grep test
grep: ./a: No such file or directory
grep: b: No such file or directory
grep: c: No such file or directory
请注意,即使是 -print0 也存在此问题。
我认为最好-exec grep
与 find 一起使用,它将在内部处理所有文件名并避免此问题:
> find . -exec grep test {} \;
test
>