8

我喜欢 unixfind命令,但是当我想在我的项目中搜索任何目录或子目录中的任何文件中的一段文本时,我总是觉得它太“繁琐”而无法使用。
有没有更简单的方法来做到这一点?

4

5 回答 5

9

试用grep实用程序:

  1. 递归搜索目录树中的字符串:

利用: grep -rl alvin .

  1. 搜索多个子目录:

您的递归grep搜索不必仅限于当前目录。下一个示例显示如何递归搜索两个不相关的目录以查找不区分大小写的字符串“alvin”:

grep -ril alvin /home/cato /htdocs/zenf
  1. 递归使用 egrep:

您还可以使用该命令执行递归搜索,该egrep命令可让您一次搜索多个模式。

egrep -ril 'aja|alvin' .

请注意,在这种情况下,搜索模式周围需要引号。

摘要: grep -r 注释:

关于grep -r命令的几点说明:

  • 这个 grep 命令没有多大意义,除非您也将它与-l(小写“L”)标志一起使用。该标志告诉 grep 打印匹配的文件名。

  • 不要忘记在 grep 命令的末尾列出一个或多个目录。如果您忘记添加任何目录,grep 将尝试从标准输入中读取(像往常一样)。

  • 如图所示,您也可以使用其他普通的 grep 标志,包括 -i 忽略大小写,-v 反转搜索的含义等。

于 2015-01-06T11:45:58.847 回答
2

git grep是一种方法,但它会忽略未跟踪的文件(所以它不完全等同于你正在做的任何事情find)。其他一些避免find' 奇怪语法的方法:

grep -r "<string>" /path/to/repo

您也可以尝试我个人最喜欢的grep替代方案ack,它的表现优于我grepgit grep轶事经验:

ack "<string>" /path/to/repo ;# path is unnecessary if you're already in the repo
于 2012-08-10T12:58:22.043 回答
2

Grep 是最简单的方法。

grep -r 'text to find' .
于 2019-03-06T20:37:04.583 回答
1

git grep应用程序的基本目录中的“您的文本字符串”是执行此操作的好方法。

正如克里斯托弗指出的那样ack是有用的。

他的安装方法对我不起作用。我必须做:

sudo apt-get install ack-grep

然后为了方便

alias ack='ack-grep '  # So that I can just type ack "string"

我还将添加到我的~/.bash_aliases文件中。

于 2012-08-09T16:15:32.107 回答
1

如果您担心在大型项目中搜索缓慢,您应该看看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

有关更多说明,请参阅自述文件。

于 2017-05-19T08:54:31.690 回答