我喜欢 unixfind
命令,但是当我想在我的项目中搜索任何目录或子目录中的任何文件中的一段文本时,我总是觉得它太“繁琐”而无法使用。
有没有更简单的方法来做到这一点?
5 回答
试用grep
实用程序:
- 递归搜索目录树中的字符串:
利用: grep -rl alvin .
- 搜索多个子目录:
您的递归grep
搜索不必仅限于当前目录。下一个示例显示如何递归搜索两个不相关的目录以查找不区分大小写的字符串“alvin”:
grep -ril alvin /home/cato /htdocs/zenf
- 递归使用 egrep:
您还可以使用该命令执行递归搜索,该egrep
命令可让您一次搜索多个模式。
egrep -ril 'aja|alvin' .
请注意,在这种情况下,搜索模式周围需要引号。
摘要: grep -r 注释:
关于grep -r
命令的几点说明:
这个 grep 命令没有多大意义,除非您也将它与-l(小写“L”)标志一起使用。该标志告诉 grep 打印匹配的文件名。
不要忘记在 grep 命令的末尾列出一个或多个目录。如果您忘记添加任何目录,grep 将尝试从标准输入中读取(像往常一样)。
如图所示,您也可以使用其他普通的 grep 标志,包括 -i 忽略大小写,-v 反转搜索的含义等。
git grep
是一种方法,但它会忽略未跟踪的文件(所以它不完全等同于你正在做的任何事情find
)。其他一些避免find
' 奇怪语法的方法:
grep -r "<string>" /path/to/repo
您也可以尝试我个人最喜欢的grep
替代方案ack,它的表现优于我grep
的git grep
轶事经验:
ack "<string>" /path/to/repo ;# path is unnecessary if you're already in the repo
Grep 是最简单的方法。
grep -r 'text to find' .
git grep
应用程序的基本目录中的“您的文本字符串”是执行此操作的好方法。
正如克里斯托弗指出的那样ack
是有用的。
他的安装方法对我不起作用。我必须做:
sudo apt-get install ack-grep
然后为了方便
alias ack='ack-grep ' # So that I can just type ack "string"
我还将添加到我的~/.bash_aliases
文件中。
如果您担心在大型项目中搜索缓慢,您应该看看The Silver Searcher。它非常快。在一个 75 000 行项目中,字符串“TODO”的测试运行时间不到 10 毫秒。
自述文件摘录:
Ag有什么了不起的?
- 它比ack快一个数量级。
- 它会忽略 .gitignore 和 .hgignore 中的文件模式。
- 如果源代码库中有您不想搜索的文件,只需将它们的模式添加到 .ignore 文件即可。(咳嗽*.min.js咳嗽)
- 命令名称比 ack 短 33%,并且所有键都在 home 行!
Ag现在相当稳定。大多数更改是新功能、小错误修复或性能改进。在我的基准测试中,它比 Ack 快得多:
ack test_blah ~/code/ 104.66s user 4.82s system 99% cpu 1:50.03 total ag test_blah ~/code/ 4.67s user 4.58s system 286% cpu 3.227 total
Ack 和 Ag 发现了相同的结果,但 Ag 快了 34 倍(3.2 秒对 110 秒)。我的 ~/code 目录大约是 8GB。感谢 git/hg/ignore,Ag 只搜索了其中的 700MB。
它可以通过大多数包存储库安装,例如:
apt-get install silversearcher-ag